[pgsql-jp: 31498] Re: TRIGGERの中で使用する「 now」について
Jun Kitamura
kitamura @ zoozee.jp
2003年 11月 19日 (水) 00:15:35 JST
北村@休憩モードです。
> 拝見させて頂きました。
> 「now() と CURRENT_TIMESTAMP は同じ」という事と、
> 「トランザクションが開始された時間」という事が読み取れました。
>
> 今回の場合、トランザクションは明示的に指定していないので、
> update文ごとに異なるトランザクションという扱いになると
> 思いますので、「トランザクションが開始された時間」となって
> いないように思うのですが。
そのとおりです。今回の場合は、「トランザクションが開始された
時間うんぬん」は関係ありません。
>
> > VALUE句で now を指定していますが、
> > 関数 now() にするべきではないでしょうか?
>
> now()に書き換えてみましたが、結果は同じでした。
たぶん、
CREATE or replace FUNCTION test_func() RETURNS TRIGGER AS '
BEGIN
INSERT INTO test_log
VALUES(old.s,old.update_time,CURRENT_USER,''now()'');
-- ^^^^^^^^^
RETURN NEW;
END;
' LANGUAGE 'plpgsql';
のように書き直されたかと思いますが、正解は
VALUES(old.s,old.update_time,CURRENT_USER,now());
です。
''now()'' とすると、この PL/pgSQL が初めて実行された時の日時
になってしまいます。初回実行時にコンパイルされ、'' で囲まれ
ているため固定された文字列(now()の実行結果)が入ります。
>
> さらにいろいろとやってみた所、現在時刻をINSERT文のVALUES句に
> 書いた場合と、テーブルのDEFAULTに書いた場合で違いはなく、
> CURRENT_TIMESTAMPとnow()で動作が異なっているようです。
>
> | now() | CURRENT_TIMESTAMP
> --------+-------+------------------
> DEFAULT | ● | ○
> INSERT | ● | ○
>
> という関係のようです。
> つまり、CURRENT_TIMESTAMPを使用すれば、INSERT文のVALUES句に
> 書いてもテーブルのDEFAULTに書いても意図した結果となるようです。
> ただ、こうなるとnow()がいつの時間を示すのか気になりますね。
・・・・う。色々と実験されてるようですね。
外してたらごめんなさい。
pgsql-jp メーリングリストの案内