Postgres 10の新機能 について説明しているページでは、「トリガーの遷移表」について言及しています。
トリガーの遷移表
この機能は
AFTER STATEMENT
は、必要に応じて、古い行と新しい行をクエリに公開することで、便利でパフォーマンスの高いトリガーをかけます。この機能の前に、AFTER STATEMENT
トリガーはこれらに直接アクセスできず、回避策はビザンチンであり、パフォーマンスが低かった。多くのトリガーロジックをAFTER STATEMENT
、FOR EACH ROWトリガーが必要とする各行での高価なコンテキスト切り替えを行う必要性を回避します。
遷移表とは何ですか?
FOR EACH ROW
トリガーのOLD
およびNEW
レコード変数がどのように存在するか知っていますか?
遷移表はFOR EACH STATEMENT
と同等です。それらは新旧のタプルを含むテーブルなので、トリガーは何が変更されたかを確認できます。
私はクレイグの機能の説明が本当に好きです。 SQL-2011仕様では、これらをトリガーのコンテキストで "削除、挿入、または置換される行のコレクションを遷移表と呼びます。"A 同様の説明がドキュメントで提供されています
AFTER
トリガーの遷移テーブルは標準の方法でREFERENCING
句を使用して指定されますが、FOR EACH ROW
トリガーで使用される行変数はREFERENCING
句で指定されない場合があります。これらは、トリガー関数が記述されている言語に依存する方法で使用できます。一部の言語は、OLD ROW AS OLD NEW ROW AS NEW.
を含むREFERENCING
句があるかのように効果的に動作します
基本的に、それらはステートメント全体の変更を利用できるようにします。これは非常に便利です。参考までに、作成トリガーのDDLは、遷移テーブルを使用すると次のようになります。
REFERENCING OLD TABLE AS oldtable NEW TABLE AS newtable
例はここ を見ることができ、これは テストスイート からのものです。
CREATE TABLE transition_table_base (id int PRIMARY KEY, val text);
CREATE FUNCTION transition_table_base_ins_func()
RETURNS trigger
LANGUAGE plpgsql
AS $$
DECLARE
t text;
l text;
BEGIN
t = '';
FOR l IN EXECUTE
$q$
EXPLAIN (TIMING off, COSTS off, VERBOSE on)
SELECT * FROM newtable
$q$ LOOP
t = t || l || E'\n';
END LOOP;
RAISE INFO '%', t;
RETURN new;
END;
$$;
CREATE TRIGGER transition_table_base_ins_trig
AFTER INSERT ON transition_table_base
REFERENCING OLD TABLE AS oldtable NEW TABLE AS newtable
FOR EACH STATEMENT
EXECUTE PROCEDURE transition_table_base_ins_func();
追加のメモ
AFTER
トリガーでのみ使用できます。ON CONFLICT
などを考慮しています。PG 10で使用できるかどうかは完全にはわかりません。 遷移表に関する未解決の問題 はたくさんあります。ほとんどにパッチがあります。ある種の日常的な内紛があります。重労働は他の誰かに拾われたようです。 thread は、すぐにわかることを示しています。