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