Saltar al contenido principal
Avanzado
20 min de lectura

Triggers

Funciones que se ejecutan automáticamente ante eventos en la base de datos

Un TRIGGER es una función que se ejecuta automáticamente cuando ocurre un evento (INSERT, UPDATE, DELETE) en una tabla.

Crear función para trigger

sql
1CREATE OR REPLACE FUNCTION actualizar_fecha_modificacion()2RETURNS TRIGGER AS $$3BEGIN4    NEW.fecha_modificacion = NOW();5    RETURN NEW;6END;7$$ LANGUAGE plpgsql;

Crear trigger

sql
1CREATE TRIGGER trigger_actualizar_fecha2    BEFORE UPDATE ON usuarios3    FOR EACH ROW4    EXECUTE FUNCTION actualizar_fecha_modificacion();

Tipos de triggers

  • BEFORE: Se ejecuta antes de la operación
  • AFTER: Se ejecuta después de la operación
  • INSTEAD OF: Reemplaza la operación (solo en vistas)
  • FOR EACH ROW: Se ejecuta por cada fila afectada
  • FOR EACH STATEMENT: Se ejecuta una vez por sentencia
  • Ejemplo: Auditoría

    sql
    1CREATE TABLE auditoria_usuarios (2    id SERIAL PRIMARY KEY,3    usuario_id INT,4    accion TEXT,5    dato_anterior JSONB,6    dato_nuevo JSONB,7    fecha TIMESTAMP DEFAULT NOW()8);9 10CREATE OR REPLACE FUNCTION auditar_usuarios()11RETURNS TRIGGER AS $$12BEGIN13    INSERT INTO auditoria_usuarios (usuario_id, accion, dato_anterior, dato_nuevo)14    VALUES (15        COALESCE(NEW.id, OLD.id),16        TG_OP,17        CASE WHEN TG_OP IN ('UPDATE', 'DELETE') THEN row_to_json(OLD)::jsonb END,18        CASE WHEN TG_OP IN ('INSERT', 'UPDATE') THEN row_to_json(NEW)::jsonb END19    );20    RETURN NEW;21END;22$$ LANGUAGE plpgsql;23 24CREATE TRIGGER trigger_auditoria25    AFTER INSERT OR UPDATE OR DELETE ON usuarios26    FOR EACH ROW27    EXECUTE FUNCTION auditar_usuarios();

    Sintaxis

    Sintaxis
    sql
    1CREATE [OR REPLACE] TRIGGER nombre_trigger2{BEFORE | AFTER | INSTEAD OF} {INSERT | UPDATE | DELETE}3ON nombre_tabla4[FOR EACH ROW]5EXECUTE FUNCTION nombre_funcion();

    Ejemplos

    Trigger de actualización

    Actualizar fecha_modificacion automáticamente

    Ejemplo
    sql
    1-- Función2CREATE OR REPLACE FUNCTION set_fecha_mod()3RETURNS TRIGGER AS $$4BEGIN5    NEW.fecha_modificacion = NOW();6    RETURN NEW;7END;8$$ LANGUAGE plpgsql;9 10-- Trigger11CREATE TRIGGER trg_set_fecha12    BEFORE UPDATE ON usuarios13    FOR EACH ROW14    EXECUTE FUNCTION set_fecha_mod();

    Resultado:

    CREATE TRIGGER