Postgresの「遷移テーブル」とは何ですか?


12

Postgres 10の新機能を説明するページには、「トリガー用の移行テーブル」が記載されています。

トリガーの遷移表

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

遷移表とは何ですか?

回答:


12

トリガーの変数OLDNEWレコード変数の存在をご存知FOR EACH ROWですか?

遷移表はFOR EACH STATEMENT同等です。それらは古いタプルと新しいタプルを持つテーブルなので、トリガーは何が変わったかを見ることができます。


9

クレイグのこの機能の説明は本当に気に入っています。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();

追加の注意事項

  1. AFTERトリガーでのみ使用可能です。
  2. 彼らはのようなものを考慮しますON CONFLICT

PG 10で利用できるかどうかが完全にはわからないことを指摘することが重要です。遷移表には多くの未解決の問題があります。ほとんどにはパッチがあります。ある種の内戦があります。重荷が他の誰かに拾われたようです。スレッドは、我々はすぐに知っているだろうことを示しています。

著者は答えた-再び順調に進んでいるようだ。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.