postgresqlトリガーのドキュメント を見てきましたが、行レベルのトリガーの例しか表示されていないようですが、ステートメントレベルのトリガーの例が見つかりません。
特に、NEW
は単一のレコード用であるため、単一のステートメントで更新/挿入された行を反復処理する方法は明確ではありません。
OLD
およびNEW
がnullであるか、ステートメントレベルのトリガーで定義されていません。 ドキュメントごと:
NEW
データ型
RECORD
;行レベルのトリガーでINSERT
/UPDATE
操作の新しいデータベース行を保持する変数。 この変数は、ステートメントレベルのトリガーおよびDELETE
操作ではnullです。
OLD
データ型RECORD;行レベルのトリガーでの
UPDATE
/DELETE
操作の古いデータベース行を保持する変数。 この変数は、ステートメントレベルのトリガーおよびINSERT
操作ではnullです。
大胆な強調鉱山。
Postgres 10までは、これはわずかに異なりますが、ほとんど同じ効果があります。
...この変数は、ステートメントレベルのトリガーではunassignedです。 .。
これらのレコード変数はまだステートメントレベルのトリガーには使用できませんが、新機能は次のとおりです。
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();