[pgsql-jp: 36921] Re: ON UPDATEルール中でのUPDATE

catsmoon fortuna catsmoon @ circus.ocn.ne.jp
2006年 3月 23日 (木) 21:20:39 JST


FORTUNAです。

>>トランザクション内部で実行しているからと予想します。
>>コマンドラインからもトランザクションを明示すればエラーが発生しませんか?
> 
> 
>  試してみたのですが発生しませんでした.
> 
> testdb=# begin;
> BEGIN
> testdb=# UPDATE pg_class SET relhasrules = false WHERE relname = 't_test';
> UPDATE t_test SET test_id = 10 WHERE test_id = 1; UPDATE pg_class SET
> relhasrules = true WHERE relname = 't_test';
> UPDATE 1
> UPDATE 1
> UPDATE 1
> testdb=# update t_test SET test_id = 9 WHERE test_id = 10;
> ERROR:  query rewritten 100 times, may contain cycles
> testdb=# COMMIT ;
> COMMIT
> testdb=# update t_test SET test_id = 9 WHERE test_id = 10;
> ERROR:  query rewritten 100 times, may contain cycles
> testdb=#

予想違いでしたね、すみません。


> UPDATE pg_class SET relhasrules = false WHERE relname = 'テーブル名';
> 
>  の文が含まれていようがいまいが,それを含めたルールのアクション部分全体を実行
> する前に,書換えシステムがクエリ自体を書き換えようとして,UPDATE文を無限に
> (100回まで)展開し続けるような気がします.
> 
>  繰り返しになりますが上記UPDATE文が実行される前に,ルールを適用してUPDATEクエ
> リを書き換え続けるのであれば,いくらルール内に上記UPDATE文が含まれていても関係
> ないように思います.
> 
>  皆様,この理解で正しいでしょうか?.

この部分はよくわかりません。
ルールで同じ問題に遭遇したことが過去にあり私は即あきらめてしまいました。

ルールをオンオフ制御する発想がすばらしいですね。
私はそのようなことは考えもつかずトリガーで対処しました。
ルールでの解法はわかりませんがトリガーを使ってみてはいかがでしょうか?



-- 
FORTUNA



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