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

Shuji TANAKA stanaka @ longpro.ne.jp
2006年 3月 23日 (木) 00:02:02 JST


いつもありがたく参考にさせていただいております.

 ルールの使い方に関して質問したいと思います.よろしくお願いします.
 あるテーブルに対するON UPDATEルール中で,そのテーブル自身に対するUPDATE文を
使用したかったため,次のようにルールを定義しました.

CREATE TABLE t_test(
  test_id int,
  test_code int
);

CREATE RULE t_test_test_id_to_test_code_rule_u
AS ON UPDATE TO t_test
DO(
  UPDATE pg_class SET relhasrules = false WHERE relname = 't_test';
  UPDATE t_test SET test_code = new.test_id;
  UPDATE pg_class SET relhasrules = true WHERE relname = 't_test';
);

 この状態で,psqlから次のように実行したところ,

INSERT INTO t_test VALUES ( 1, null );
UPDATE t_test SET test_id = 2;

 次のようなエラーが返ります.

ERROR:  query rewritten 100 times, may contain cycles

 何も考えずにUPDATE文をON UPDATEルール中で使用したときに,上記と同様のエラー
で実現できなかったので,これを避けるためにルール定義中にルールを一時的に無効に
するクエリを含めようとしたのですが,ルールの実行中にはそのようなクエリは意味が
ないのでしょうか?.

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

 どのようにすれば実現できるのでしょうか?.または実現できないのでしょうか?.
 どなたかご教示いただければ幸いです.なお下記のような環境で作業を行っておりま
す.

OS:CentOS3.6
PostgreSQL:7.3.10
(CentOSのrh-postgresql-7.3.10-2とrh-postgresql-server-7.3.10-2のrpm)

 よろしくお願いいたします.





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