PostgreSQLのルールとトリガーを同時に設定されているテーブルを触る機会があったので、実行順序について調べてみました。(仕様書読めば一瞬だったかも)
[準備]
テーブルを2つ準備する。
テーブルの1つは単純にトリガーやルールを設定するためだけのテーブル
残りのテーブルは実行結果を保存するためのテーブル
・ルール
CREATE OR REPLACE RULE r AS
ON INSERT TO t1_table DO INSERT INTO t1_table2 (st)
VALUES (‘r’::character varying);
・トリガー
CREATE OR REPLACE FUNCTION t1()
RETURNS trigger AS
$BODY$
BEGIN
insert into t2_table(st) values (‘t1’);
RETURN NEW;
END;
CREATE OR REPLACE FUNCTION t2()
RETURNS trigger AS
$BODY$
BEGIN
insert into t2_table(st) values (‘t2’);
RETURN NEW;
END;
実行順序はシーケンスで取得してt2_tableに保存する
[実行結果]
実行処理の区分とシーケンスの値は以下の通りになった。(シーケンスは以前使用したものを流用したので初期値が適当になっていた)
“t1”;8332096
“t2”;8332097
“r”;8332098
この結果から実行順序は以下の通りであることが実証された。
トリガー(BEFORE)→トリガー(AFTER)→ルール
個人的にはトリガーを使うことが多くルールはあまり使用しませんが、使用した際には気ををつけたいと思います。(自動登録処理を実装する場合に気をつける必要があるかな?)