Z jemného manuálu:
36.1. Přehled spouštěcího chování
[...]
U spouštěče na úrovni řádku zahrnují vstupní data takéNEW
řádek proINSERT
aUPDATE
spouštěče a/neboOLD
řádek proUPDATE
aDELETE
spouštěče. Spouštěče na úrovni příkazů v současnosti nemají žádný způsob, jak prozkoumat jednotlivé řádky upravené příkazem.
A z Spouštěcích procedur:
NEW
Typ datRECORD
; proměnná obsahující nový řádek databáze proINSERT
/UPDATE
operace ve spouštěčích na úrovni řádků. Tato proměnná jeNULL
ve spouštěčích na úrovni příkazů a proDELETE
operace.
Všimněte si, co říká o spouštěčích na úrovni řádků a spouštěčích na úrovni příkazů.
Máte spouštěč na úrovni příkazu:
...
FOR EACH STATEMENT
EXECUTE PROCEDURE f_log_datei();
Spouštěče na úrovni příkazu se spouštějí jednou za příkaz a příkaz lze použít na více řádků, takže pojem dotčený řádek (což je to, co NEW
a OLD
are about) jednoduše neplatí.
Pokud chcete použít NEW
(nebo OLD
) ve spouštěči, pak chcete, aby se spouštěč spustil pro každý ovlivněný řádek, a to znamená, že chcete spouštěč na úrovni řádku:
CREATE TRIGGER log_datei AFTER INSERT OR UPDATE OR DELETE
ON dateien
FOR EACH ROW
EXECUTE PROCEDURE f_log_datei();
Právě jsem změnil FOR EACH STATEMENT
až FOR EACH ROW
.
Váš spouštěč by měl také něco vracet:
Spouštěcí funkce musí vracet buď
NULL
nebo hodnota záznamu/řádku, která má přesně strukturu tabulky, pro kterou bylo pravidlo spuštěno.
[...]
Vrácená hodnota pravidla na úrovni řádku spuštěnaAFTER
nebo spouštěč na úrovni příkazu spuštěnýBEFORE
neboAFTER
je vždy ignorováno; může to být i nulové. Kterýkoli z těchto typů spouštěčů však může přerušit celou operaci vyvoláním chyby.
Měli byste tedy RETURN NEW;
nebo RETURN NULL;
ve vaší spoušti. Máte spoušť AFTER, takže nezáleží na tom, který RETURN použijete, ale já bych zvolil RETURN NEW;
.