Modelado físico avanzado relacional de bases de datos
1. ¿Qué es un Trigger y para qué sirve?
Un trigger es una acción que se activa automáticamente antes o después de una operación (INSERT, UPDATE, DELETE) en una tabla.
✅ Casos de uso comunes:
- Registrar automáticamente los cambios en una tabla de auditoría.
- Prevenir modificaciones incorrectas en los datos.
- Actualizar otra tabla cuando se inserta, elimina o modifica un registro.
| Tipo de Trigger | Cuándo se ejecuta |
|---|---|
| BEFORE | Antes de que ocurra el evento |
| AFTER | Después de que ocurra el evento |
| INSTEAD OF | Reemplaza la acción del evento (solo en SQL Server y PostgreSQL) |
2. Creación de Triggers en Bases de Datos
Los triggers se pueden definir para ejecutarse en diferentes eventos.
📌 Ejemplo: Crear un trigger para registrar auditoría
Este trigger guarda en una tabla auditoria cada vez que se inserta un empleado.
1CREATE TABLE auditoria ( 2 id INT AUTO_INCREMENT PRIMARY KEY, 3 accion VARCHAR(50), 4 fecha TIMESTAMP DEFAULT CURRENT_TIMESTAMP 5); 6 7CREATE TRIGGER tr_insert_empleado 8AFTER INSERT ON empleados 9FOR EACH ROW 10INSERT INTO auditoria (accion) VALUES ('Se insertó un nuevo empleado');
3. Triggers para Validación de Datos
Podemos usar triggers para validar datos antes de insertarlos o modificarlos.
📌 Ejemplo: Evitar salarios menores a un mínimo permitido
Si intentamos insertar un salario menor a 1000, se generará un error.
1CREATE TRIGGER tr_validar_salario 2BEFORE INSERT ON empleados 3FOR EACH ROW 4BEGIN 5 IF NEW.sueldo < 1000 THEN 6 SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Error: El salario no puede ser menor a 1000'; 7 END IF; 8END;
4. Triggers para Actualizar Datos Automáticamente
Si un empleado cambia de departamento, queremos registrar el cambio.
📌 Ejemplo: Registrar cambios de departamento
Cada vez que un empleado cambie de departamento, guardamos el cambio en una tabla de historial.
1CREATE TABLE historial_departamentos ( 2 id INT AUTO_INCREMENT PRIMARY KEY, 3 empleado_id INT, 4 departamento_anterior INT, 5 departamento_nuevo INT, 6 fecha TIMESTAMP DEFAULT CURRENT_TIMESTAMP 7); 8 9CREATE TRIGGER tr_actualizar_departamento 10AFTER UPDATE ON empleados 11FOR EACH ROW 12IF OLD.departamento_id <> NEW.departamento_id THEN 13 INSERT INTO historial_departamentos (empleado_id, departamento_anterior, departamento_nuevo) 14 VALUES (NEW.id, OLD.departamento_id, NEW.departamento_id); 15END IF;
5. Eliminación de Triggers
Si queremos eliminar un trigger, usamos:
1DROP TRIGGER tr_nombre;
6. Ejemplo Completo
Queremos un trigger que:
- Evite que se eliminen empleados con más de 5 años en la empresa.
- Guarde en una tabla de auditoría cuando se elimine un empleado.
1CREATE TABLE auditoria_empleados ( 2 id INT AUTO_INCREMENT PRIMARY KEY, 3 empleado_id INT, 4 accion VARCHAR(50), 5 fecha TIMESTAMP DEFAULT CURRENT_TIMESTAMP 6); 7 8CREATE TRIGGER tr_prevenir_baja_empleado 9BEFORE DELETE ON empleados 10FOR EACH ROW 11BEGIN 12 IF TIMESTAMPDIFF(YEAR, OLD.fecha_contratacion, NOW()) > 5 THEN 13 SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Error: No puedes eliminar empleados con más de 5 años'; 14 ELSE 15 INSERT INTO auditoria_empleados (empleado_id, accion) VALUES (OLD.id, 'Empleado eliminado'); 16 END IF; 17END;