[pgsql-jp: 31506] Re: TRIGGERの中で使用する「 now」について

T.Suzuki t_suzuki @ kenwood-eng.co.jp
2003年 11月 19日 (水) 12:29:11 JST


鈴木@KEGと申します。

説明足らずで混乱させてしまいました...

北村さん wrote:
> のように書き直されたかと思いますが、正解は
> 
>       VALUES(old.s,old.update_time,CURRENT_USER,now());
> 
> です。
その通りですね。
7.3.4、7.4で動作の確認が取りました。

> ''now()'' とすると、この PL/pgSQL が初めて実行された時の日時
> になってしまいます。初回実行時にコンパイルされ、'' で囲まれ
> ているため固定された文字列(now()の実行結果)が入ります。
これについて、少し補足致します。

CREATE FUNCTIONをした時点では、'now' 及び、'now()'は評価されない事を
確認しました。( 7.4 で確認 )

多分ですが、DeferredTriggerExecuteでトリガはキャッシュされるているようです。
あるコネクション内でトリガーの初回実行時に、
'now' 及び、'now()'が評価され、日付文字列に置き換わり、
同じコネクション内で複数回実行しても、キャッシュの評価済みトリガが使われる為、
コネクション内の初回評価時の日付が使われつづけていると思います。

ポイントとして、'now' は評価される時点が違うという事でしょうか。

松本さん wrote:
> > さらにいろいろとやってみた所、現在時刻をINSERT文のVALUES句に
> > 書いた場合と、テーブルのDEFAULTに書いた場合で違いはなく、
> > CURRENT_TIMESTAMPとnow()で動作が異なっているようです。
> > 
> >         | now() | CURRENT_TIMESTAMP
> > --------+-------+------------------
> > DEFAULT |   ●  |       ○
> > INSERT  |   ●  |       ○
> > 
> > という関係のようです。
> > つまり、CURRENT_TIMESTAMPを使用すれば、INSERT文のVALUES句に
> > 書いてもテーブルのDEFAULTに書いても意図した結果となるようです。
> > ただ、こうなるとnow()がいつの時間を示すのか気になりますね。
ここの例の、関数 now() が文字列に変換されている場合( Default 'now()' )
確かに上記の結果になります。
Default now() とするとどうなるでしょうか?

# 話しは逸れますが、7.4 で Default句に 'now' と記述すると
# テーブル定義(psql の \d) で、ちゃんとCREATE時の日時になるように
# 修正が入ったのですね。HISTORYをみて今日気付きました。
 -----------------------------------------
      鈴木 徹 (SUZUKI Toru)
      KENWOOD ENGINEERING CORPORATION
      E-mail:t_suzuki @ kenwood-eng.co.jp
 -----------------------------------------



pgsql-jp メーリングリストの案内