EINFÜGEN ... ZURÜCK ..wird leer angezeigt, wenn die Anweisung BEFORE trigger abgebrochen wird
-
21-12-2019 - |
Frage
Ich habe einen PostgreSQL-Trigger vor dem Einfügen beim Erstellen, der Einfügungen grundsätzlich in Untertabellen umleitet.Sobald ich den Datensatz eingefügt habe, möchte ich die Anforderung abbrechen, um doppelte Daten zu vermeiden (indem ich sie nicht in die übergeordnete Tabelle einfüge). Daher verwende ich return NULL im Trigger.Das Problem ist, dass ich den Datensatz zurückgeben muss, damit ich die ID erhalten kann.Wenn ich NULL zurückgebe, erhalte ich NULL.
Das obige Problem wird unter dem folgenden Link erläutert:PostgreSQL-Trigger gibt nichts zurück
Eine der Antworten besagt, dass in die übergeordnete Tabelle eingefügt werden soll (indem nicht null zurückgegeben, sondern neu zurückgegeben wird) und der Trigger nach dem Einfügen verwendet wird, um ihn aus der übergeordneten Tabelle zu löschen.Aber ich betrachte 1000 Schreibvorgänge pro Sekunde und dies kann aufgrund der ein ernstes Leistungsproblem darstellen deletes.is gibt es eine andere Möglichkeit, dies zu tun?
Um genau zu sein, gibt es eine Möglichkeit, die ID einer eingefügten Zeile zurückzugeben, ohne sie in die übergeordnete Tabelle einzufügen und später zu löschen.
Lösung
Ich schrieb die Antwort, auf die Sie sich beziehen.Wie ich dort drüben schon angedeutet habe:
Sie könnten auch eine verwenden
RULE ... INSTEAD ..
dazu.
RULE
Geschäftsregeln kann schwierig sein.Ich würde lieber Trigger verwenden, wo es möglich ist. Achten Sie darauf, ein bisschen zu lesen, bevor Sie dies versuchen:
CREATE OR REPLACE RULE tbl_ins AS
ON INSERT TO tbl
DO INSTEAD
INSERT INTO tbl2 (col1, col2, ...) -- just do mention columns where ...
VALUES (NEW.col1, NEW.col2, ...) -- ... you want to insert column defaults
RETURNING tbl2.*
Das würde Werte zurückgeben von tbl2
unter Vermeidung von Phantomreihen. Jedoch, pro Dokumentation auf CREATE RULE
:
In einer Regel für
INSERT
,UPDATE
, oderDELETE
in einer Ansicht können Sie eine hinzufügenRETURNING
klausel, die die Spalten der Ansicht ausgibt.Diese Klausel wird sein wird verwendet, um die Ausgaben zu berechnen, wenn die Regel von einem ausgelöst wirdINSERT RETURNING
,UPDATE RETURNING
, oderDELETE RETURNING
befehl jeweils.Wenn die Regel durch einen Befehl ohne ausgelöst wirdRETURNING
, RegelRETURNING
klausel wird ignoriert. Die aktuelle Implementierung ermöglicht nur bedingungslosINSTEAD
regeln enthaltenRETURNING
;
Kühne Betonung von mir.
Da du erwähnst sub-tables
, Ich nehme an, Sie bräuchten Bedingungen, um die Einsätze zu verteilen...
currval()
/ lastval()
Wenn Sie mit einem Abzug arbeiten FOR EACH ROW
Sie können einfach geeignete Werte aus Sequenzen abrufen mit currval()
/ lastval()
.Der schwierige Teil besteht darin, diese Werte von einer Triggerfunktion zurückzugeben.Ich kann nur daran denken, an einen temporären Tisch zu schreiben.Braucht etwas Nachdenken, wann man es schafft und wann man es fallen lässt...
Ich würde wahrscheinlich den gesamten Ansatz überdenken und leiten Sie die Daten auf mehrere um INSERT
anweisungen zu tatsächlichen Zieltabellen...