クレイグのこの機能の説明は本当に気に入っています。SQL-2011仕様では、トリガーのコンテキストで「削除、挿入、または置換されている行のコレクションを遷移テーブルと呼びます」と定義しています。同様の説明はドキュメントで提供され、
AFTER
トリガーの遷移表REFERENCING
は標準的な方法で句を使用して指定されFOR EACH ROW
ますが、トリガーで使用される行変数はREFERENCING
句で指定されない場合があります。それらは、トリガー関数が書かれている言語に依存する方法で利用可能です。一部の言語は、以下REFERENCING
を含む句があるかのように効果的に動作します。OLD ROW AS OLD NEW ROW AS NEW.
基本的に、ステートメント全体の変更を利用できるようにするため、非常に便利です。参照用に、作成トリガーの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で利用できるかどうかが完全にはわからないことを指摘することが重要です。遷移表には多くの未解決の問題があります。ほとんどにはパッチがあります。ある種の内戦があります。重荷が他の誰かに拾われたようです。スレッドは、我々はすぐに知っているだろうことを示しています。
著者は答えた-再び順調に進んでいるようだ。