[pgsql-jp: 30657] データ更新がない場合にトリガ処理を行わないには?

aiko_0303 @ infoseek.jp aiko_0303 @ infoseek.jp
2003年 8月 1日 (金) 13:34:29 JST


お世話になっております。kishikawaです。

[pgsql-jp: 30632]
PL/pgSQLで"(09:00)AAA" から"AAA"のみを抜き出すには?
の関連質問です。

・TBL1のINSERT or UPDATEがあったときに呼び出される。
・TBL1の'氏名(name)'列データ更新時に、TBL2の'備考(ref)'列に「(HH:MM)氏名データ(改行コード)」
  の形式で書き込まれる。

TBL1が '氏名(name)'、'住所(adrs)'の列をそれぞれ持っていたとして、
「TBL1:'氏名(name)'が更新されなかった場合は、
  TBL2:'備考(ref)'には何も書き込まない」
という処理をしたいです。
(TBL1の'氏名'更新時にのみ、トリガでTBL2:'備考(ref)'に書き込む)


<実現方法>
 ※ Webブラウザ ←→ PHP ←→ PostgreSQLの場合

(1)アプリケーション(PHP)側で制御。
 初期表示時の氏名値を保存しておき、変更があったら
 UPDATE TBL1 SET adrs='東京都xxxx' ; でUPDATE。

(2)トリガ側で制御
 UPDATE時に、氏名カラムがUPDATE前の値と一致していたら
 何もしない。


<質問点>
(1)に関して
☆実現方法は?
******************************************* 
-- 氏名が''だったら何もしない
IF NEW.name ISNULL OR NEW.name = '''' THEN
  RETURN NEW;
END IF ;
******************************************* 
実際には、UPDATE TBL1 SET adrs='東京都' ;
をすると、TBL2:'備考(ref)'に書き込まれてしまいます。

☆IF NEW.name ISNULLではダメ?

(2)に関して
******************************************* 
-- 氏名の変更がなければ何もしない
IF OLD.name=NEW.name THEN
  RETURN NEW;
END IF ;
******************************************* 
を追記。
現在の氏名カラムが'山田太郎'だとすると、

・UPDATE TBL1 SET name='山田太郎', adrs='東京都xxxx' ; 
・UPDATE TBL1 SET adrs='東京都xxxx' ;

両方書き込まれない。

☆前者は理解できるのですが、後者が書き込まれないのはなぜ?



以上です。
質問点ならびに(1)と(2)どちらで行うのが良いのかの
ご助言を頂きたいのですが…
私的には(1)でやるのが、普通なのかな、と思っています。
(ただ現在の作りでは、
内容変更の有無にかかわらず、全てのカラムをUPDATEしているので
修正的には(2)が簡単です…)


質問内容がPostgreSQLでない部分もあり恐縮ですが、
よろしくお願いします。





******************
    aiko.K
******************
------------------------------------------------------------------------
isweb 今、初期費用が 無料です by infoseek
http://ap.infoseek.co.jp/isweb_camp2.html  

 

 






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