Dal bel manuale:
36.1. Panoramica del comportamento di trigger
[...]
Per un trigger a livello di riga, i dati di input includono anche il NEW
riga per INSERT
e UPDATE
attivatori e/o il OLD
riga per UPDATE
e DELETE
trigger. I trigger a livello di istruzione attualmente non hanno alcun modo per esaminare le singole righe modificate dall'istruzione.
E da Procedure di attivazione:
NEW
Tipo di dati RECORD
; variabile che contiene la nuova riga del database per INSERT
/UPDATE
operazioni nei trigger a livello di riga. Questa variabile è NULL
nei trigger a livello di istruzione e per DELETE
operazioni.
Nota cosa dice sui trigger a livello di riga e sui trigger a livello di istruzione.
Hai un trigger a livello di istruzione:
...
FOR EACH STATEMENT
EXECUTE PROCEDURE f_log_datei();
I trigger a livello di istruzione vengono attivati una volta per istruzione e un'istruzione può essere applicata a più righe, quindi la nozione di riga interessata (che è ciò che NEW
e OLD
sono circa) semplicemente non si applica.
Se vuoi usare NEW
(o OLD
) in un trigger, quindi desideri che il trigger venga eseguito per ciascuna riga interessata e ciò significa che desideri un trigger a livello di riga:
CREATE TRIGGER log_datei AFTER INSERT OR UPDATE OR DELETE
ON dateien
FOR EACH ROW
EXECUTE PROCEDURE f_log_datei();
Ho appena cambiato FOR EACH STATEMENT
a FOR EACH ROW
.
Anche il tuo trigger dovrebbe restituire qualcosa:
Una funzione trigger deve restituire NULL
o un valore di record/riga avente esattamente la struttura della tabella per cui è stato attivato il trigger.
[...]
Il valore restituito di un trigger a livello di riga attivato AFTER
o un trigger a livello di istruzione attivato BEFORE
o AFTER
viene sempre ignorato; potrebbe anche essere nullo. Tuttavia, uno qualsiasi di questi tipi di trigger potrebbe comunque interrompere l'intera operazione generando un errore.
Quindi dovresti RETURN NEW;
o RETURN NULL;
nel tuo grilletto. Hai un trigger AFTER quindi non importa quale RETURN usi, ma io andrei con RETURN NEW;
.