Ich setze eine Funktion für einen Trigger ausgelöst, wenn ich in Tabelle A einfügen, die ich zuerst einen Eintrag in TabelleB erstellen würde, und erstellen Sie dann einige andere Einträge in der Tabelle C, in denen es einen Fremdschlüssel gibt bezogen auf TabelleB. Aber ich erhalte einen Fehler, da es versucht, in Tabelle C einen Wert in das Fremdschlüsselfeld einzufügen, der in der Tabelle nicht vorhanden ist, solange die Funktion nicht beendet wurde.Sequencing Ergebnisse in Funktion PostgreSQL 9.5
Gibt es einen Weg, der innerhalb einer Funktion eine Art Rückkehr in meine Funktion bringt, die aber die Funktion nicht verlassen und dann den Rest ausführen würde? Etwas, was würde wie folgt aussehen:
CREATE OR REPLACE FUNCTION trigger1() RETURNS trigger AS
$BODY$
begin
insert into tableB values (new.value);
RETURN NEW;
insert into tableC (id, fkey) values (new.something, new.value);
RETURN NEW;
end;
$BODY$
LANGUAGE plpgsql;
Ich habe versucht, die Funktion in zwei verschiedene Trigger zu trennen, in der alphabetischen Reihenfolge der Ausführung zu bestellen, aber ohne Erfolg, vielleicht, weil sie beide laufen, bevor ...
Irgendeine Idee?
Dank
Dank. Ich habe Probleme zu verstehen, wie das funktioniert. Was passiert, wenn ich den Fremdschlüssel aufschiebe und der CONSTRAINT nicht eingehalten wird? Wird es einen Fehler verursachen? Am Ende der Transaktion wird es sich also an die gesamte Transaktion "erinnern" und diese stornieren? –
Ja, bei einem Constraint-Fehler wird ein Fehler ausgelöst und die Transaktion wird zurückgesetzt. Sie müssen jedoch keine explizite Transaktion verwenden. Wenn Sie keine äußere Transaktion haben, ist die Trigger-Funktion selbst eine einzelne Transaktion. Im Allgemeinen funktioniert es wie erwartet, ohne dass etwas in einem Trigger geändert werden muss. – klin