[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 メーリングリストの案内