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
- Sie sind nur für
AFTERTrigger verfügbar .
- 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.