[pgsql-jp: 33875] 挿入・更新時のTimeStamp自動挿入
OHTSUKA Ko-hei
techml @ saesparam.com
2004年 8月 14日 (土) 11:33:02 JST
大塚です。
MySQLから移行し始めて、多彩な機能に驚いているのですが、
一方で暴れ馬的と言うか、気難しいDBだなという感じも受けて
います。
よく判らないのでいろいろ試すのですが、ちょっと間違うと
止まってしまったりで、なんかおかしければDBさえ再起動
させれば何とかなるといった感じのMySQLと違って、結構初心
者に厳しいなあと…。
個人サイト上で動かしているのですが、このDBだと一方でサー
ビスしつつ裏で同じサーバ上でいろいろテストしたり勉強する
っていうのは難しそうですね…。
開発マシン用意しないといけないのかなあ…。
で、その「自分でいろいろ試して動かなくなってしまった」
機能の実現に関して質問なんですが、
MySQLでは、たとえばセッションテーブル等で挿入・更新時に
タイムスタンプを更新する等は、DBが勝手にやってくれるの
ですが、PostgreSQLではやってくれないようなので、テーブル
構造でlast_accessフィールドのデフォルト値に
date_trunc('second'::text, now())
等と指定する事でとりあえず自動で入るようにしてみました。
でも、これでは挿入時に自動で入れてくれても、更新時には
入れてくれない事に気付きました。
更新時に変更するにはどうするのかな、と調べて、トリガとか
言う機能が使えそうだ、という事で、以下のような関数と
トリガを作ってみました。
CREATE add_timestamp() RETURNS trigger
LANGUAGE plpgsql
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
AS '
DECLARE
BEGIN
UPDATE sessions SET last_access = date_trunc('second'::text, now())
WHERE id = NEW.id;
RETURN NEW;
END;
'
(上は本当はphpPgAdminに作らせたので、微妙に違うかもしれません)
CREATE TRIGGER sessions_set_timestamp AFTER INSERT OR UPDATE
ON sessions FOR EACH ROW EXECUTE PROCEDURE add_timestamp()
ところが、上記を設定したとたん、sessionsテーブルに挿入・更新
動作を行うと、DBが反応しなくなってしまうようになってしまいま
した。
何が問題なのでしょうか?
また、やりたい事は単純に更新時刻の自動挿入だけなので、それを
行う定石等ありましたら教えていただければ幸いです。
以上、よろしくお願いいたします。
pgsql-jp メーリングリストの案内