質問

トリガーを使用して「クラシック」時間ベースのパーティションを使用しています。元のテーブルで実行される別のトリガーが必要であることがわかりました。

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回作成します。

ライセンス: CC-BY-SA帰属
所属していません dba.stackexchange
scroll top