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 proINSERTaUPDATEspouštěče a/neboOLDřádek proUPDATEaDELETEspouš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/UPDATEoperace ve spouštěčích na úrovni řádků. Tato proměnná jeNULLve spouštěčích na úrovni příkazů a proDELETEoperace.
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ď
NULLnebo 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ěnaAFTERnebo spouštěč na úrovni příkazu spuštěnýBEFOREneboAFTERje 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; .