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