[pgsql-jp: 33767] 不正INSERTでもSPI_exec()が正常終了??
正雄 白神
shiraga_masao2 @ hotmail.com
2004年 7月 28日 (水) 10:19:20 JST
いつもお世話になっております。白神です。
現在、PostgresのトリガをC言語にて作成しています。
(以下、「トリガ関数」)
使用しているのはSPI_xxx()関数群です。
==============================
OS:RedHat ES
DB::Postgres7.3.6
==============================
該当トリガ関数では、table_Aのupdateを検知し、
CSVファイルを読み込んでtable_BにInsertする処理を
行っています。
しかし、たまたまCSVの内容が壊れてしまうなどの
(極めてレアな)ケースで、不正なInsertを発行して
しまうケースがあるのですが、そのとき、
SPI_exec関数を発行しても常にSPI_OK_INSERT(7)が
返ってきてしまいます・・。
その後、SPI_finish()発行し、タプルをreturnした段階で
該当エラーが発生しています。
=============================================================
INFO: job_no=999
INFO: t_flg=4
INFO: SPI_finish() < 0.030000 sec.>
INFO: SPI_finish() < 0.030000 sec.>
ERROR: tj001_b_fk1 referential integrity violation
- key referenced from tj001_b not found in tj001_a
XXXdb_beta_0_4e_shiraga=>
=============================================================
★次のようにSPI_exec()を発行しているのですが、
どこがおかしいのでしょうか?
======================================================
while(入力データがある間){
res = SPI_exec(sql, 1);
elog("<%d>[%s][rc=%d]\n", i, sql, res);
if (res != SPI_OK_INSERT) {
// error procedure on failure SQL
elog("[%s] return %d", sql, res);
return_flg = 5; //do ROLLBACK
break;
}
}
======================================================
★また、SPI_exec()の戻り値でエラーを検出するにはどうすればいいでしょうか?
(エラー検知が非同期に走ってる・・???
あるいはSPI_connect()/SPI_exec()/SPI_finish()以外に
何か必要な手続きを踏んでいない・・???)
「おおよそ、何を調べればよいか」みたいなことだけでも
もし教えていただければ幸いです。
ご多忙のところ恐れ入りますが、宜しくお願いします。
----+----1----+----2----+----3----+----4----+----5----+----6
白神 正雄(しらが まさお)
m.shiraga @ ryoin-kobe.com
_________________________________________________________________
楽しい絵文字でココロ伝わるメッセンジャー http://messenger.msn.co.jp/
pgsql-jp メーリングリストの案内