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

bxcel bxcel @ prophet.jp
2003年 11月 19日 (水) 14:56:44 JST


松本と申します。

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

ありがとうございます。
やっと少し理解できたようです。

1.'now'はリテラル値、now()及びCURRENT_TIMESTAMPは関数
2.リテラル値は解釈時、関数は実行時にその値が決定する
    (テキストに変換される)
3.関数を''で囲むとリテラル値として扱われる
4.トリガはコネクション単位でコンパイル結果がキャッシュされる

という事なんですね。
今回の現象は、すべてこの結果に従ったものとなっていたのですね。

> > > つまり、CURRENT_TIMESTAMPを使用すれば、INSERT文のVALUES句に
> > > 書いてもテーブルのDEFAULTに書いても意図した結果となるようです。
> > > ただ、こうなるとnow()がいつの時間を示すのか気になりますね。
> ここの例の、関数 now() が文字列に変換されている場合( Default 'now()' )
> 確かに上記の結果になります。
> Default now() とするとどうなるでしょうか?

期待した通りの結果となりました。
ありがとうございました。




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