PostgreSQLでトリガー実行順序を指定する方法は?
-
16-10-2019 - |
質問
トリガーを使用して「クラシック」時間ベースのパーティションを使用しています。元のテーブルで実行される別のトリガーが必要であることがわかりました。
CREATE TABLE twitter_interactions(...);
CREATE OR REPLACE FUNCTION insert_twitter_interactions ...;
CREATE TRIGGER insert_twitter_interactions_trig
BEFORE INSERT OR UPDATE on twitter_interactions
FOR EACH ROW EXECUTE PROCEDURE insert_twitter_interactions();
CREATE OR REPLACE FUNCTION maintain_data_pointers ...;
CREATE TRIGGER maintain_data_pointers_trig
BEFORE INSERT OR UPDATE on twitter_interactions
FOR EACH ROW EXECUTE PROCEDURE insert_twitter_interactions();
私は完全に確認されていませんが、維持トリガーの前にパーティション化されたロジックが実行されると思われ、行が親テーブルに到達しないため、2番目のトリガーは発砲しません。
実行したい場合はどうなりますか AFTER INSERT OR UPDATE
同じように?行は元のテーブルに載っていないので、後のロジックを実装するのに途方に暮れています。
解決
もっとよく言うことができませんでした マニュアルはここにあります:
ある場合
BEFORE
またINSTEAD OF
トリガーリターンNULL
, 、操作はその行のために放棄され、その後のトリガーは発射されません(その行のために)。
(アルファベット順に)後で同じイベントでトリガーされることもありません。 AFTER
トリガーは発射されます BEFORE
トリガーキャンセル。
他のヒント
postgreSQLは、名前でアルファベット順にトリガーを実行します。したがって、必要な順序でそれらを取得する名前を必ず使用してください。から ドキュメント
SQLは、複数のトリガーを作成時に起動する必要があることを指定します。 PostgreSQLは、より便利であると判断された名前の注文を使用します。
ところで、SQLは同じトリガーを2回作成します。
所属していません dba.stackexchange