es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error sugiere que hay una restricción de no nulos en el campo user_id de la tabla settings, 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 tabla settings. Aquí tienes una versión actualizada de la función que incluye esta verificación:

    CREATE OR REPLACE FUNCTION create_settings() 
        RETURNS TRIGGER
        LANGUAGE PLPGSQL
        AS 
    $$
    BEGIN
        IF (OLD.id IS NOT NULL) THEN
            INSERT INTO settings (user_id) VALUES (OLD.id);
        END IF;
        RETURN OLD;
    END;
    $$
    

    Con esta modificación, la función del disparador solo insertará un nuevo registro de settings si OLD.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 campo user_id, aunque esto dependería de los requisitos de tu aplicación y puede que no sea ideal para tu caso de uso.

Comments are closed.