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

Shuji TANAKA stanaka @ longpro.ne.jp
2006年 3月 23日 (木) 20:54:37 JST


お世話になります.

>>  また,pg_classのrelhasrulesカラムをON/OFFするのではなく,pg_rewriteテーブ
ル
>> のev_classカラムを一時的にnullにすることも試してみたのですが,いずれもpsql
のコ
>> マンドラインから実行した場合はうまく動作してくれるのですが,ルール定義中に
含め
>> てしまった場合は上記のようにエラーが発生しました.
> トランザクション内部で実行しているからと予想します。
> コマンドラインからもトランザクションを明示すればエラーが発生しませんか?

 試してみたのですが発生しませんでした.

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=#

 今www.postgresql.jpにある7.4系のマニュアルの中では最新のものと思われる,
7.4.6のマニュアルを読んでいて気がついたのですが(7.4からは開発者ガイド,プログ
ラマガイドなどの区別がなくなっているのですね),34章3節に,以下のような記述が
あります.

> ルールアクションで生成された問い合わせツリーは、再度書き換えシステムに
> 渡され、相当数の問い合わせツリーの結果をもたらす、より多くのルールの適
> 用を受けることもあります。ですから、ルールアクションにおける問い合わせ
> ツリーは、別のコマンドタイプか、別の結果リレーションを持っていなければ
> なりません。さもないと、この再帰的処理によりループになってしまいます。
> 現在、100回までの再帰処理反復制限が組み込まれています。 100回反復処理
> を行った後にもまだ適用すべき更新ルールがあった場合は、ルールシステムは
> 複数のルール定義にまたがったループであると想定し、エラーを報告します。

 7.3系でも同じかどうかわかりませんが,これのような気がしますね.この記述は7.3
系のマニュアルにも合ったような気がしないでもないです.
 ルール中に,

UPDATE pg_class SET relhasrules = false WHERE relname = 'テーブル名';

 の文が含まれていようがいまいが,それを含めたルールのアクション部分全体を実行
する前に,書換えシステムがクエリ自体を書き換えようとして,UPDATE文を無限に
(100回まで)展開し続けるような気がします.

 繰り返しになりますが上記UPDATE文が実行される前に,ルールを適用してUPDATEクエ
リを書き換え続けるのであれば,いくらルール内に上記UPDATE文が含まれていても関係
ないように思います.

 皆様,この理解で正しいでしょうか?.





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