Del buen manual:
[...]
Para un disparador de nivel de fila, los datos de entrada también incluyen el NEW
fila para INSERT
y UPDATE
disparadores, y/o el OLD
fila para UPDATE
y DELETE
disparadores Los activadores de nivel de declaración actualmente no tienen ninguna forma de examinar las filas individuales modificadas por la declaración.
Y de los procedimientos de activación:
NEW
Tipo de datos RECORD
; variable que contiene la nueva fila de la base de datos para INSERT
/UPDATE
operaciones en activadores de nivel de fila. Esta variable es NULL
en disparadores a nivel de declaración y para DELETE
operaciones.
Tenga en cuenta lo que dice sobre los activadores de nivel de fila y los activadores de nivel de instrucción.
Tiene un disparador a nivel de declaración:
...
FOR EACH STATEMENT
EXECUTE PROCEDURE f_log_datei();
Los disparadores de nivel de declaración se activan una vez por declaración y una declaración se puede aplicar a varias filas, por lo que la noción de fila afectada (que es lo que NEW
y OLD
se trata) simplemente no se aplica.
Si desea utilizar NEW
(o OLD
) en un disparador, quiere que el disparador se ejecute para cada fila afectada y eso significa que quiere un disparador a nivel de fila:
CREATE TRIGGER log_datei AFTER INSERT OR UPDATE OR DELETE
ON dateien
FOR EACH ROW
EXECUTE PROCEDURE f_log_datei();
Acabo de cambiar FOR EACH STATEMENT
a FOR EACH ROW
.
Su activador también debería devolver algo:
Una función de activación debe devolver NULL
o un valor de registro/fila que tenga exactamente la estructura de la tabla para la que se activó el activador.
[...]
El valor de retorno de un activador de nivel de fila activado AFTER
o un activador de nivel de instrucción activado BEFORE
o AFTER
siempre se ignora; bien podría ser nulo. Sin embargo, cualquiera de estos tipos de activadores podría anular toda la operación al generar un error.
Entonces deberías RETURN NEW;
o RETURN NULL;
en tu gatillo. Tiene un disparador DESPUÉS, por lo que no importa qué RETORNO use, pero yo iría con RETURN NEW;
.