[pgsql-jp: 32126] Re: Rule と Lock

Tatsuo Ishii t-ishii @ sra.co.jp
2004年 1月 27日 (火) 13:28:48 JST


 石井です.

> > 分からないのは、どうして実際にはデータが書込まれない daily_log01 テーブ
> > ルの lock によって、ルールにより変換される daily_log への insert 自体が
> > ブロックされてしまうのか、です。ルールで更新される可能性のあるテーブル
> > は、条件に合致しようとしなかろうと、share mode の lock と競合するなんら
> > かのロックを取得してしまうのでしょうか?
> 
> insert_daily_log02を削除してもロックされるところを見ると,そのようです
> ね.daily_log とdaily_log01にRow Exclusive Lockがかかっていました(ちな
> みに,Row Exclusive LockはINSERT/UPDATE/DELETEで必ず取得されます).

この件ですが,ruleの中で直接INSERTするのではなく,関数を呼んでその中で
間接的にINSERTすれば大丈夫のようですよ.すなわち,

CREATE OR REPLACE FUNCTION f_insert_daily_log01(VARCHAR) RETURNS VOID
AS '
BEGIN
INSERT INTO daily_log01(log_memo) VALUES ($1);
RETURN;
END;
' LANGUAGE PLPGSQL;

のような関数を作り,

CREATE RULE insert_daily_log01 AS ON INSERT TO daily_log
    WHERE 1=0
    DO INSTEAD SELECT f_insert_daily_log01(NEW.log_memo);

のようなruleを定義します.なお,関数はPL/pgSQLである必要はないのですが,
SQL関数だけは7.4ではインライン展開されてしまうのでたぶん駄目だと思いま
す.
--
Tatsuo Ishii



pgsql-jp メーリングリストの案内