[pgsql-jp: 33708] 【再質問】UPDATEのTrigger 内で発行したInsert がwait
白神 正雄
shiraga_masao2 @ hotmail.com
2004年 7月 20日 (火) 15:41:40 JST
こんにちは。白神@大阪です。
下記の件、[質問2]のほうは、サンプルを参照することで
解決することができました。
ありがとうございました。
が、[質問1]のほうが未だに解決できなくて困っています・・。
本メール末尾にて、再質問させてください。
>こんにちは。石田@苫小牧市です。
>
>白神 正雄 wrote:
> > はじめまして。
> > 白神といいます。
>(中略)
> > 前置きが長くなりましたが・・・
> > ===【質問】==========================================
> > [質問1] ・・・上記(c)の処理について
> > Updateのトリガー関数(C言語)から、別テーブルにInsertしているのに
> > Insertがwaitになるのは、原因としてどういったことが考えられるでしょうか?
> > MVCCが狂ってしまわれたのでしょうか・・・?
> > ※明示的にロックをかけるようなことはしていません。
> >
> >
> > [質問2] ・・・上記(d)の処理について
> > Postgresでは、トリガー関数(C言語)内で、トリガーを起こしたテーブルの
> > 同じ行(の同じフィールド)を更新することはできるのでしょうか?
> > 実現するために何か特別なことをしなければいけないのでしょうか?
> > ※トリガーを発生元のTuppleを書き換えるとか。
> > 現状、関数呼び出し時に取得したTuppleをそのまま返してます。
> > ===================================================
> >
>
>[質問2]については、
>triggerdata->tg_newtupleをSPI_modifytuple()で書き換えることで
>できるはずです。(やったことはないですが)。
>
>参考になるのは、
>http://www.postgresql.jp/document/pg743doc/html/triggers.html
>だと思います。また、http:
>//www.postgresql.jp/document/pg743doc/html/trigger-example.html
>の最後にも書かれていますが、
>src/test/regress/regress.cとcontrib/spiにもサンプルがあるようです。
>
☆☆☆☆☆ [再質問] ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
現状、次のような処理でInsertがwait状態になってしまい、返ってきません。
【OS:RedHat ES, DB:Postgres7.3.6】
TABLE_A : Updateトリガー(AFTER) ・・・C言語関数呼び出し
|
+−shell起動 <成功>
・ |
・ +−【WindowsXP】フォルダにsmbmount <成功>
・ |
・ +−C++で作成のexe(要するに実行形式)を起動
・ ・ |
・ ・ +−【WindowsXP】フォルダにある
・ ・ ・ CSVファイルを読み込み、
・ ・ ・ TABLE_Bにインサート
・ ・ ・ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑
・ ・ ・ ここでinsert wait(ToT)
・ ・ |
・ ・ +−正常時戻り値0
・ ・ I/Oエラーなどあれば戻り値1
・ ・ |
・ +−−+
・ |
・ +C++のexeの戻り値をそのままC言語関数に返す
・ |
+−−+
|
+C++のexeが戻り値0ならTABLE_Aのフラグ=4
戻り値1ならTABLE_Aのフラグ=5
|
|
<終了>
上記の処理の中で、shell以下は、単体では、バリバリに動きます。
が、そのshellをトリガーとして登録した関数から起動するように
すると、insert wait状態になり、一行もinesertできなくなるんです。
ps(-ef指定)コマンドで見てみると、下記のような状態になっています。
=====================================================================
tcs 23871 22924 0 13:59 pts/1 00:00:00 psql
XXXdb_beta_0_3h_shiraga
postgres 23872 23213 0 13:59 ? 00:00:00 postgres: XXX
XXXdb_beta_0_3h_shiraga [local] UPDATE
root 23874 23872 0 14:00 ? 00:00:00 /bin/sh
/home/XXX/XXX_trigger_tj1b/smount.sh
root 23882 1 0 14:00 ? 00:00:00 smbmount //NNN.NN.N.NNN/mnt
/mnt/XXX_smb1 -o guest
root 23884 23874 0 14:00 ? 00:00:00
/home/XXX/XXX_trigger_tj1b/CPLUSPLUS.exe
postgres 23885 23213 0 14:00 ? 00:00:00 postgres: XXX
XXXdb_beta_0_3h_shiraga 127.0.0.1 INSERT waiting
=====================================================================
原因として、どういったことが考えられるでしょうか?
※この質問内容では分かりにくい点がありましたら、
ご教授いただければ幸いです。
以上、宜しくお願いします。
_________________________________________________________________
楽しい絵文字でココロ伝わるメッセンジャー http://messenger.msn.co.jp/
pgsql-jp メーリングリストの案内