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;

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.


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.


Kevin, ein Teammitglied, dankt Ihnen. Er suchte tagelang und stieß schließlich auf dieses Juwel. Dies sollte die offizielle Antwort sein !!! Vielen Dank!
Asnyder
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.