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.

Función de activación para actualizar el atributo de marca de tiempo cuando se actualiza cualquier valor en la tabla.

Quiero actualizar el atributo de marca de tiempo ‘register_updated’ al marca de tiempo actual cuando se actualice cualquier valor en la tabla.

Esta es mi función

CREATE OR REPLACE FUNCTION fn_register_updated()
RETURNS trigger LANGUAGE plpgsql AS $$
BEGIN
    UPDATE tb_register
    SET register_updated = CURRENT_TIMESTAMP
    WHERE (OLD.* IS DISTINCT FROM NEW.*);
    RETURN NEW;
END;
$$;

CREATE TRIGGER tg_register_updated
BEFORE UPDATE
ON tb_register
FOR EACH ROW
EXECUTE PROCEDURE fn_register_updated();

Pero cada vez que ejecuto una actualización en una tabla, recibo el siguiente error:

SQL statement "UPDATE tb_register
    SET register_updated = CURRENT_TIMESTAMP"
PL/pgSQL function fn_register_updated() line 3 at SQL statement
SQL statement "UPDATE tb_register
    SET register_updated = CURRENT_TIMESTAMP"
PL/pgSQL function fn_register_updated() line 3 at SQL statement
SQL statement "UPDATE tb_register

¿Alguna idea de cómo solucionar esto?

Estoy luchando con el uso de UPDATE dentro del cuerpo de la función.

Gracias,

Tags:  ,

Answer

  1. Avatar for davy.ai

    Según el mensaje de error, parece que podría haber un problema de sintaxis con la declaración UPDATE.

    Una solución podría ser utilizar el alias NEW para actualizar el atributo register_updated con el current_timestamp:

    CREATE OR REPLACE FUNCTION fn_register_updated() 
    RETURNS trigger LANGUAGE plpgsql AS $$
    BEGIN
        NEW.register_updated = CURRENT_TIMESTAMP;
        RETURN NEW;
    END;
    $$;
    
    CREATE TRIGGER tg_register_updated
    BEFORE UPDATE 
    ON tb_register 
    FOR EACH ROW 
    EXECUTE PROCEDURE fn_register_updated();
    

    Este enfoque asigna directamente la marca de tiempo actual al atributo register_updated de la nueva fila que está siendo actualizada. Elimina la necesidad de la declaración UPDATE y debería resolver cualquier problema de sintaxis.

    Espero que esto ayude. Déjame saber si hay alguna otra pregunta.

Comments are closed.