Fügen Sie RECORD in einer Triggerfunktion in eine Tabelle ein

8

Ich möchte eine RECORD-Datentypvariable (NEW-Variable) in eine Tabelle in einem Trigger einfügen. Wie würde SQL aussehen?
Die folgenden Versuche waren erfolglos:

EXECUTE 'INSERT INTO my_table VALUES ' || NEW;
EXECUTE 'INSERT INTO my_table VALUES ' || NEW.*;
EXECUTE 'INSERT INTO my_table SELECT * FROM ' || NEW;
Egidi
quelle

Antworten:

5

Sie müssen den Datensatz erweitern.

Ich habe auch eine Spaltenliste zur hinzugefügt insertund die viel sicherere EXECUTE ... USINGForm verwendet.

EXECUTE 'INSERT INTO my_table (col1, col2, col3) VALUES (?, ?, ?)' USING NEW.col1, NEW.col2, NEW.col3;

Bitte erläutern Sie Ihren Anwendungsfall ausführlicher, wenn dies das Problem nicht löst.

Craig Ringer
quelle
15

Eigentlich müssen Sie den Datensatz nicht manuell erweitern. Solange Anzahl , Reihenfolge und Spaltentypen zwischen den beiden Tabellen übereinstimmen, können Sie diese viel einfachere Form verwenden:

EXECUTE 'INSERT INTO my_table SELECT ($1).*'
USING NEW;

Da Ihr Tabellenname stabil zu sein scheint, benötigen Sie nicht einmal dynamisches SQL mit EXECUTE. Nur eine Ebene INSERT:

INSERT INTO my_table SELECT (NEW).*

Die Klammern sind für einen zusammengesetzten Typ erforderlich, um die Syntax eindeutig zu machen.

Fragen Sie sich, was sich in Zukunft in Ihrer App ändern könnte:

  • Wenn die Zieltabelle synchron mit der Quelltabelle (oder Ziel- und Quell sind gleich) bleiben sollte, dann ist es besser , nicht explizit auf Liste Spalten.

  • Wenn Sie nur bestimmte Spalten auswählen und dies nicht durch mögliche Aktualisierungen der Quell- oder Zieltabelle ändern möchten, ist es besser, eine Spaltenliste anzugeben.

Erwin Brandstetter
quelle
Kevin, ein Teammitglied, dankt Ihnen. Er suchte tagelang und stieß schließlich auf dieses Juwel. Dies sollte die offizielle Antwort sein !!! Vielen Dank!
Asnyder