PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Attivazione di Postgres dopo l'accesso all'inserto NEW

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; .