[pgsql-jp: 32550] Re: トリガ内で別テーブルにinsertした際の反映タイミング
SAKATA Tetsuo
sakata.tetsuo @ lab.ntt.co.jp
2004年 3月 23日 (火) 17:04:49 JST
こんにちは。坂田@横須賀です。
はじめまして>清田さん
あまり詳しくないのですが、考えてみました。
詳しい方のフォローを期待しています。
清田 知嗣 さんwrote:
> あるテーブルに対してUPDATEをした際
> トリガを起動させストアド内で別テーブルに対して
> insertを行っております。
>
> この際insertの反映のタイミングはトリガが終了した時点なのでしょうか?
元のinsert文からトリガ関数が起動されている以上、例プログラムのFORループ中の
insert文が挿入した結果(12345)が他のトランザクションから見えるのは、元のinsert文が
コミットすることが前提となると思います。
> トリガとストアドの内容は以下の通りです。
>
> create function func_test() returns trigger as
> '
> begin
> FOR j IN 1..100000 LOOP
> insert into i_test values(12345);
> END LOOP;
> return NEW;
> end;
> '
> language 'plpgsql'
> ;
>
> CREATE TRIGGER tri_test AFTER INSERT OR UPDATE ON
> c_test FOR EACH ROW EXECUTE PROCEDURE func_test();
FORループ中のinsertの結果が1件ずつDBに反映されるようにするのは、
上述の理由からおそらくムリではないかと思います。
> 私の理想としては1件ずつinsertが反映され
> 監視が行えるようにしたいと思っております。
このinsertの進捗状況を知っているのは、トリガ関数ですから、
ここからinsertの進捗状況を出力させるような仕組みを考えるのが
良いのではないかと思います
(マニュアルには参考になりそうな例が出ています
http://www.postgresql.jp/document/pg742doc/html/trigger-example.html )。
別案として、
1件だけinsertするトランザクションを10万回繰り返す処理を、トリガを経由して
何らかの方法で実行すれば、1トランザクションが終了するごとに結果が
他のトランザクションから参照できるようになります。
しかしこの方法では、毎回トランザクションが完結していますから、
挿入処理のどこかの時点で失敗すると、挿入されたデータはコミット済みなので、
DB上にゴミとして残ることになってしまいます。
よって、こうした方法は適切ではないでしょう。
ご参考になれば幸いです。
--
坂田 哲夫@NTT サイバースペース研究所
sakata.tetsuo _at_ lab.ntt.co.jp
SAKATA, Tetsuo. Yokosuka JAPAN.
pgsql-jp メーリングリストの案内