Inicio > Cursos > SQL y Bases de Datos > Triggers
SQL y Bases de DatosDiseño y OptimizaciónLección 15 de 20

Triggers

Los triggers son funciones que se ejecutan automáticamente en respuesta a eventos en una tabla (INSERT, UPDATE, DELETE). Son perfectos para auditoría, validaciones complejas, y mantener datos derivados sincronizados. Se ejecutan BEFORE o AFTER el evento.

-- Tabla de auditoría: registra cambios en empleados
CREATE TABLE empleados_auditoria (
  id              SERIAL PRIMARY KEY,
  empleado_id     INTEGER,
  operacion       VARCHAR(10),  -- INSERT, UPDATE, DELETE
  datos_antiguos  JSONB,
  datos_nuevos    JSONB,
  usuario_db      VARCHAR(100),
  fecha           TIMESTAMP DEFAULT NOW()
);

-- Función del trigger (debe retornar TRIGGER)
CREATE OR REPLACE FUNCTION fn_auditoria_empleados()
RETURNS TRIGGER
LANGUAGE plpgsql AS $$
BEGIN
  IF TG_OP = 'INSERT' THEN
    INSERT INTO empleados_auditoria
      (empleado_id, operacion, datos_nuevos, usuario_db)
    VALUES
      (NEW.id, 'INSERT', row_to_json(NEW)::JSONB, current_user);
    RETURN NEW;

  ELSIF TG_OP = 'UPDATE' THEN
    INSERT INTO empleados_auditoria
      (empleado_id, operacion, datos_antiguos, datos_nuevos, usuario_db)
    VALUES
      (NEW.id, 'UPDATE', row_to_json(OLD)::JSONB,
       row_to_json(NEW)::JSONB, current_user);
    RETURN NEW;

  ELSIF TG_OP = 'DELETE' THEN
    INSERT INTO empleados_auditoria
      (empleado_id, operacion, datos_antiguos, usuario_db)
    VALUES
      (OLD.id, 'DELETE', row_to_json(OLD)::JSONB, current_user);
    RETURN OLD;
  END IF;
END;
$$;

-- Crear el trigger (se dispara AFTER cada operación)
CREATE TRIGGER trg_auditoria_empleados
AFTER INSERT OR UPDATE OR DELETE
ON empleados
FOR EACH ROW
EXECUTE FUNCTION fn_auditoria_empleados();

-- Trigger BEFORE para validación o modificar el valor
CREATE OR REPLACE FUNCTION fn_normalizar_email()
RETURNS TRIGGER LANGUAGE plpgsql AS $$
BEGIN
  -- Convertir email a minúsculas antes de guardar
  NEW.email := LOWER(TRIM(NEW.email));
  RETURN NEW;  -- BEFORE trigger: retornar NEW modifica los datos
END;
$$;

CREATE TRIGGER trg_normalizar_email
BEFORE INSERT OR UPDATE ON users
FOR EACH ROW EXECUTE FUNCTION fn_normalizar_email();
ConsejoEn un trigger BEFORE, retornar NULL cancela la operación. En uno AFTER, no puedes modificar los datos (la operación ya ocurrió). Usa BEFORE para validar o modificar datos, AFTER para efectos secundarios como auditoría.
← Vistas y FuncionesPostgreSQL Avanzado →

Practica esta lección

Resuelve los ejercicios del curso de SQL y Bases de Datos en la app, gratis y con corrección automática.

Empezar a practicar