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