PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Postgres-Trigger nach Insert-Zugriff auf NEW

Aus dem feinen Handbuch:

36.1. Überblick über das Triggerverhalten
[...]
Bei einem Trigger auf Zeilenebene enthalten die Eingabedaten auch den NEW Zeile für INSERT und UPDATE Auslöser und/oder der OLD Zeile für UPDATE und DELETE löst aus. Auslöser auf Anweisungsebene haben derzeit keine Möglichkeit, die einzelnen Zeilen zu untersuchen, die durch die Anweisung geändert wurden.

Und von Trigger-Prozeduren:

NEW
Datentyp RECORD; Variable, die die neue Datenbankzeile für INSERT enthält /UPDATE Operationen in Triggern auf Zeilenebene. Diese Variable ist NULL in Triggern auf Anweisungsebene und für DELETE Operationen.

Beachten Sie, was es über Trigger auf Zeilenebene und Trigger auf Anweisungsebene sagt.

Sie haben einen Auslöser auf Anweisungsebene:

...
FOR EACH STATEMENT
EXECUTE PROCEDURE f_log_datei();

Auslöser auf Anweisungsebene werden einmal pro Anweisung ausgelöst, und eine Anweisung kann auf mehrere Zeilen angewendet werden, daher der Begriff der betroffenen Zeile (was NEW ist und OLD ungefähr sind) trifft einfach nicht zu.

Wenn Sie NEW verwenden möchten (oder OLD ) in einem Trigger, dann möchten Sie, dass der Trigger für jede betroffene Zeile ausgeführt wird, und das bedeutet, Sie möchten einen Trigger auf Zeilenebene:

CREATE TRIGGER log_datei AFTER INSERT OR UPDATE OR DELETE
ON dateien
FOR EACH ROW
EXECUTE PROCEDURE f_log_datei();

Ich habe gerade FOR EACH STATEMENT geändert zu FOR EACH ROW .

Ihr Trigger sollte auch etwas zurückgeben:

Eine Triggerfunktion muss entweder NULL zurückgeben oder ein Datensatz-/Zeilenwert, der genau die Struktur der Tabelle hat, für die der Trigger ausgelöst wurde.
[...]
Der Rückgabewert eines Triggers auf Zeilenebene, der AFTER ausgelöst wurde oder ein Trigger auf Anweisungsebene, der BEFORE ausgelöst wurde oder AFTER wird immer ignoriert; es könnte genauso gut null sein. Jeder dieser Auslösertypen kann jedoch immer noch den gesamten Vorgang abbrechen, indem er einen Fehler auslöst.

Sie sollten also RETURN NEW; oder RETURN NULL; in deinem Trigger. Sie haben einen AFTER-Trigger, also spielt es keine Rolle, welchen RETURN Sie verwenden, aber ich würde RETURN NEW; verwenden .