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