web-dev-qa-db-ja.com

Postgresの「遷移表」とは何ですか?

Postgres 10の新機能 について説明しているページでは、「トリガーの遷移表」について言及しています。

トリガーの遷移表

この機能はAFTER STATEMENTは、必要に応じて、古い行と新しい行をクエリに公開することで、便利でパフォーマンスの高いトリガーをかけます。この機能の前に、AFTER STATEMENTトリガーはこれらに直接アクセスできず、回避策はビザンチンであり、パフォーマンスが低かった。多くのトリガーロジックをAFTER STATEMENT、FOR EACH ROWトリガーが必要とする各行での高価なコンテキスト切り替えを行う必要性を回避します。

遷移表とは何ですか?

12
Basil Bourque

FOR EACH ROWトリガーのOLDおよびNEWレコード変数がどのように存在するか知っていますか?

遷移表はFOR EACH STATEMENTと同等です。それらは新旧のタプルを含むテーブルなので、トリガーは何が変更されたかを確認できます。

12
Craig Ringer

私はクレイグの機能の説明が本当に好きです。 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();

追加のメモ

  1. これらはAFTERトリガーでのみ使用できます。
  2. ON CONFLICTなどを考慮しています。

PG 10で使用できるかどうかは完全にはわかりません。 遷移表に関する未解決の問題 はたくさんあります。ほとんどにパッチがあります。ある種の日常的な内紛があります。重労働は他の誰かに拾われたようです。 thread は、すぐにわかることを示しています。

著者の回答-再び順調に進んでいるようです。

9
Evan Carroll