Was ist eine "Übergangstabelle" in Postgres?


12

Auf der Seite, die die Neuerungen in Postgres 10 beschreibt , wird auf „Übergangstabellen für Trigger“ verwiesen.

Übergangstabellen für Trigger

Durch diese Funktion werden AFTER STATEMENTTrigger nützlich und performant, indem die alten und neuen Zeilen je nach Bedarf Abfragen ausgesetzt werden. Vor dieser Funktion hatten AFTER STATEMENTTrigger keinen direkten Zugriff auf diese, und die Problemumgehungen waren byzantinisch und hatten eine schlechte Leistung. Viel Triggerlogik kann jetzt so geschrieben werden AFTER STATEMENT, dass teure Kontextwechsel in jeder Zeile vermieden werden, die für jeden ROW-Trigger erforderlich sind.

Was ist eine Übergangstabelle?

Antworten:


12

Sie wissen , wie es OLDund NEWRekord-Variablen für FOR EACH ROWTrigger?

Übergangstabellen sind die FOR EACH STATEMENTÄquivalente. Es sind Tabellen mit den alten und neuen Tupeln, sodass Ihre Trigger sehen können, was sich geändert hat.


9

Ich mag Craigs Erklärung des Features wirklich. Die SQL-2011-Spezifikation definiert sie im Kontext eines Triggers als "eine Sammlung von Zeilen, die gelöscht, eingefügt oder ersetzt werden, wird als Übergangstabelle bezeichnet." Eine ähnliche Erklärung finden Sie in den Dokumenten,

Während Übergangstabellen für AFTERTrigger REFERENCINGstandardmäßig mit der Klausel angegeben werden , dürfen die in FOR EACH ROWTriggern verwendeten Zeilenvariablen nicht in REFERENCINGKlausel angegeben werden. Sie sind in einer Weise verfügbar, die von der Sprache abhängt, in der die Triggerfunktion geschrieben ist. Einige Sprachen verhalten sich effektiv so, als ob eine REFERENCINGKlausel enthalten wäreOLD ROW AS OLD NEW ROW AS NEW.

Im Wesentlichen stellen sie Ihnen die Änderungen der gesamten Anweisung zur Verfügung, was sehr praktisch ist. Als Referenz sieht der DDL-On-Create-Trigger bei Übergangstabellen wie folgt aus

REFERENCING OLD TABLE AS oldtable NEW TABLE AS newtable

Sie können hier ein Beispiel sehen , und hier ist eines aus der Testsuite ,

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();

Einige zusätzliche Hinweise

  1. Sie sind nur für AFTERTrigger verfügbar .
  2. Sie berücksichtigen Dinge wie ON CONFLICT.

Es ist wichtig darauf hinzuweisen, dass es nicht ganz sicher ist, in PG 10 verfügbar zu sein . Es gibt viele offene Probleme mit Übergangstabellen . Die meisten haben Patches. Es gibt einige Kämpfe, die eine Art Routine sind. Es scheint, dass das schwere Heben von jemand anderem aufgenommen wurde. Der Thread zeigt an, dass wir es bald wissen werden.

Autor antwortete - scheint wieder gut zu laufen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.