(PostgreSQL)トリガーの遅延評価?

最後に更新してから1ヶ月がたったぞとはてなブログのメールが来たのでなにか更新を試みる...

今月は仕事が忙しかったのもあってあんまりメンタル的に余力がなかった. 疲れてるとゲームしかしなくなる病なのです... 実際残業がそこそこ多い月だといろんなことをやる気力がなくなるのは事実. どうしたものやら.

今日知ったことをちょっとだけ. postgresqlで,制約の遅延評価というものがある. たとえば主キーの制約に違反しているかをデフォルトでは各statement が終わったときにチェックして違反していたら即エラーを出すが,
遅延評価をオンにするとそれをトランザクションの終了時に先延ばしすることができる.
これを使うと全レコードの主キーの値を小さい方から順に+1するといったような処理も実現できるようになる(途中では違反していても,最後には違反していない状態なので).
んで, 今日の大事なことはこれをトリガーの起動タイミングとしても設定できるということ.
普通トリガーというとinsertとかupdateとかするタイミングで,どうしても直前直後というイメージになるけれど, これも同様に遅延評価を指定することによってトランザクションの終了時,要するにコミット時(多分コミット直前)にトリガーの処理を走らせることができる.

冷静に考えると insert→トリガー処理→update と insert→update→ トリガー処理 で毎回結果が同じになるように保証できるのかは正直全然わからない. トリガーを書いたことがないので,もしかしたらそんなことないように縛られる? いやテーブルAにレコードAをinsert →テーブルBのレコードBがトリガーで値をCに変更→テーブルBのレコードBがupdateで値をCに変更 みたいなのだと順序に明らかに左右されるような... うーんわからん.

とりあえずこのへん設定は set constraints deferred/immediate でdeferredだと遅延, immediateだと即時評価になるよう指定できます.

考えれば考えるほどこれ意味わからんやつ. 評価のタイミングとトリガーの実行タイミングでは後ろ倒ししたときの影響が全然違うような... うーん, やっぱりわからん. 誰か詳しい人教えて下さい.


以下(以上もだけど)余談: 偉い人がコミット時に走るSQLなんですよね?とかいってて自分は全然意味がわからんかった. そのPMが嫌いなのでどちらかというと煽るような目で見ていたが,無知なのは自分だったので正直恥ずかしい.あと悔しい. 言い訳は色々したいけど, 自分の無知をちゃんと認めなきゃな... ともあれ, 今日書いた記事の中身がこれなのはこういう背景があったりする.

今日はここまで. It is now or never...(意味不明)