web-dev-qa-db-ja.com

各ステートメントのトリガーの例

postgresqlトリガーのドキュメント を見てきましたが、行レベルのトリガーの例しか表示されていないようですが、ステートメントレベルのトリガーの例が見つかりません。

特に、NEWは単一のレコード用であるため、単一のステートメントで更新/挿入された行を反復処理する方法は明確ではありません。

17
diffeomorphism

OLDおよびNEWがnullであるか、ステートメントレベルのトリガーで定義されていません。 ドキュメントごと:

NEW

データ型RECORD;行レベルのトリガーでINSERT/UPDATE操作の新しいデータベース行を保持する変数。 この変数は、ステートメントレベルのトリガーおよびDELETE操作ではnullです。

OLD

データ型RECORD;行レベルのトリガーでのUPDATE/DELETE操作の古いデータベース行を保持する変数。 この変数は、ステートメントレベルのトリガーおよびINSERT操作ではnullです。

大胆な強調鉱山。

Postgres 10までは、これはわずかに異なりますが、ほとんど同じ効果があります。

...この変数は、ステートメントレベルのトリガーではunassignedです。 .。

これらのレコード変数はまだステートメントレベルのトリガーには使用できませんが、新機能は次のとおりです。

Postgres10以降の遷移表

Postgres10は遷移表を導入しました。これらは、影響を受ける行のセット全体へのアクセスを許可します。 マニュアル:

AFTERトリガーは、遷移テーブルを使用して、トリガーステートメントによって変更された行。 CREATE TRIGGERコマンドは、一方または両方の遷移テーブルに名前を割り当て、関数はそれらの名前を読み取り専用の一時テーブルであるかのように参照できます。 例43.7 は例を示しています。

コード例については、マニュアルへのリンクをたどってください。

遷移表のないステートメントレベルのトリガーの例

遷移表が登場する前は、それらはさらに一般的ではありませんでした。便利な例は、特定のDMLコマンドの後に notifications を送信することです。
これが私が使っているものの基本的なバージョンです:

-- Generic trigger function, can be used for multiple triggers:
CREATE OR REPLACE FUNCTION trg_notify_after()
  RETURNS trigger AS
$func$
BEGIN
   PERFORM pg_notify(TG_TABLE_NAME, TG_OP);
   RETURN NULL;
END
$func$  LANGUAGE plpgsql;

-- Trigger
CREATE TRIGGER notify_after
AFTER INSERT OR UPDATE OR DELETE ON my_tbl
FOR EACH STATEMENT
EXECUTE PROCEDURE trg_notify_after();
20