[pgsql-jp: 33694] UPDATEのTrigger内で発行したInsertがwait

白神 正雄 shiraga_masao2 @ hotmail.com
2004年 7月 16日 (金) 19:44:26 JST


はじめまして。
白神といいます。


表題の件、死ぬほど苦しんでます・・。

==============================
OS:RedHat ES
DB::Postgres7.3.6
==============================


少し変則的(?)なのですが、次のようなことをやろうとしてます。
(1)C言語でトリガー関数を作成し、
   TableAのUpdateのトリガーとして登録
(2)上記(1)の関数からC++で作成した関数を呼び出し、
   C++関数内でCSVファイルを読み込んで、
   CSVの内容でTableBにInsert


これにより、
  −−−−−−−−−−−−−−−−−−−−−
  (a)TableAをUpdateされたら・・・
      ↓
  (b)TableAのAfter Updateのトリガーが起動され、
     トリガー関数であるC言語関数がC++関数を呼び出す
      ↓
  (c)C++関数でCSV読込み→TableBにInsertの後、C言語関数に戻る
      ↓
  (d)C言語関数で、「上記(a)でFlg=3というUpdateがされていた場合には
     同じテーブルTableAの同じフィールドFlg=4をセット」の処理を行う
     ただし、上記(c)にてエラー発生時にはFlg=5をセットする
  −−−−−−−−−−−−−−−−−−−−−
という流れを作ろうとしているのです。


しかし、テストしてみると、ダンマリになってしまい、
ps -efで確認してみると、次の行が目にとまります。
=============================================
postgres  8447  1705  0 17:52 ?        00:00:00 postgres: tcs 
tcsdb_beta_0_3h_shiraga 172.18.2.241 INSERT waiting
=============================================

自分でテキストに出力していたログを参照しても、
やはり同じように、Insertが返ってきていないとしか
思えない状態になっています。



その後、諦めきって、Insertを投げたC++関数のプロセスをKillして
C++関数でエラー発生状態にしたところ、C言語関数でそれを
検知してFlg=5をセットしようとUpdateを投げているのですが、
すべて処理が完了した後に該当フィールドを確認しても
Flg=3になっていて、Flg=5へのUpdate処理が効いていないのです・・。



前置きが長くなりましたが・・・
===【質問】==========================================
[質問1] ・・・上記(c)の処理について
Updateのトリガー関数(C言語)から、別テーブルにInsertしているのに
Insertがwaitになるのは、原因としてどういったことが考えられるでしょうか?
MVCCが狂ってしまわれたのでしょうか・・・?
※明示的にロックをかけるようなことはしていません。


[質問2] ・・・上記(d)の処理について
Postgresでは、トリガー関数(C言語)内で、トリガーを起こしたテーブルの
同じ行(の同じフィールド)を更新することはできるのでしょうか?
実現するために何か特別なことをしなければいけないのでしょうか?
※トリガーを発生元のTuppleを書き換えるとか。
  現状、関数呼び出し時に取得したTuppleをそのまま返してます。
===================================================

以上、長くなってしまいましたが、本当に困っています。
どうか何かお分かりでしたら、些細なことでも何でも結構ですので、
どうか何か教えてください・・。


宜しくお願いします。

_________________________________________________________________
楽しい絵文字でココロ伝わるメッセンジャー http://messenger.msn.co.jp/ 




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