El disparador para crear un nuevo registro después de la creación de un nuevo usuario no funciona en PostgreSQL.
Tengo una tabla de settings
y una tabla de users
. Quiero crear un disparador para insertar un nuevo registro de settings
cada vez que se cree un nuevo usuario y hacer referencia al ID del usuario recién creado en el registro de settings
(settings.user_id
en este caso). Actualmente, he creado este disparador y función, pero cada vez que intento insertar
un registro en la tabla de users
, la consulta no se ejecuta.
Procedimiento:
sql
CREATE OR REPLACE FUNCTION create_settings()
RETURNS TRIGGER
LANGUAGE PLPGSQL
AS
$$
BEGIN
INSERT INTO settings (user_id) VALUES (OLD.id);
RETURN OLD;
END;
$$
Disparador:
sql
CREATE TRIGGER create_settings
AFTER INSERT ON users
EXECUTE PROCEDURE create_settings();
Y aquí está el error que obtengo:
sql
ERROR: null value in column "user_id" of relation "settings" violates not-null constraint
DETAIL: Failing row contains (95a8d1ae-cf9d-40be-b5d2-b2d231fb7e1b, null, null, null, null, light, 2022-01-02 15:29:14.290823).
CONTEXT: SQL statement "INSERT INTO settings (user_id) VALUES (OLD.id)"
PL/pgSQL function create_settings() line 3 at SQL statement
El único campo que necesito es el primer null
del error, que es la referencia real al usuario por ID (la mayoría de los valores que son nulos son opcionales y son NULL
por defecto).
davy.ai
El mensaje de error sugiere que hay una restricción de no nulos en el campo
user_id
de la tablasettings
, y el disparador está intentando insertar un valor nulo en ese campo.Una solución a este problema sería modificar la función del disparador para verificar si el valor
OLD.id
es nulo antes de insertarlo en la tablasettings
. Aquí tienes una versión actualizada de la función que incluye esta verificación:Con esta modificación, la función del disparador solo insertará un nuevo registro de
settings
siOLD.id
no es nulo, evitando la violación de la restricción de no nulos.Alternativamente, podrías modificar la tabla
settings
para permitir valores nulos en el campouser_id
, aunque esto dependería de los requisitos de tu aplicación y puede que no sea ideal para tu caso de uso.