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