テーブルにトリガーが複数設定されていた場合にどのような順序で実行されるのか確認してみました。

ウェブで検索してみると次の情報を見つけました。

「同一イベントに同じ種類の複数のトリガが定義された場合、名前のアルファベット順で実行されます。」

https://www.postgresql.jp/document/9.5/html/sql-createtrigger.html

仕様書なので疑うわけではないが、一様動作の確認をしてみた。

試すのは以前トリガーとルールはどちらが優先されるのかで試したテーブルに更にトリガーを追加してみた。

結果①

トリガー(tr1,tr2,tr3,tr4,tr5)それぞれが別のテーブルにINSERTを行うように設定(登録時にシーケンスから値を取得して合わせて登録します)

トリガーt1はbefore tr2~tr5まではafterトリガーです

“t1″;”2017-07-29 16:30:00.965+09”;8332102
“t2″;”2017-07-29 16:30:00.965+09”;8332103
“t3″;”2017-07-29 16:30:00.965+09”;8332104
“t4″;”2017-07-29 16:30:00.965+09”;8332105
“t5″;”2017-07-29 16:30:00.965+09”;8332106

結果②

トリガーの名前の変更

トリガー(e_tr1,d_tr2,c_tr3,b_tr4,a_tr5)に設定(before afterは変えていません)

“t1″;”2017-07-29 16:35:30.88+09”;8332114
“t5″;”2017-07-29 16:35:30.88+09”;8332115→順序が先頭になっている!!
“t4″;”2017-07-29 16:35:30.88+09”;8332116
“t3″;”2017-07-29 16:35:30.88+09”;8332117
“t2″;”2017-07-29 16:35:30.88+09”;8332118

 

[結論]

確かめて見ると本当にトリガーの名前の順序で実行されていることがわかりました。トリガーなので順序を考える必要な設計は行ったことはありませんが、複数のトリガーが設定されているテーブルの更新や追加時の動作を追う知識としては必要かなと思いました。

過去のバージョンの資料を確認しましたが7.4時代からあるので、今後も大きく変わることは無いかと思います。

 


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です