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 AFTER
Trigger REFERENCING
standardmäßig mit der Klausel angegeben werden , dürfen die in FOR EACH ROW
Triggern verwendeten Zeilenvariablen nicht in REFERENCING
Klausel 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 REFERENCING
Klausel 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
AFTER
Trigger 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.