sql >> Base de Datos >  >> RDS >> PostgreSQL

Desencadenador de Postgres después de insertar acceso NUEVO

Del buen manual:

36.1. Descripción general del comportamiento de activación
[...]
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; .