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 TriggerCuándo se ejecuta
BEFOREAntes de que ocurra el evento
AFTERDespués de que ocurra el evento
INSTEAD OFReemplaza 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:

  1. Evite que se eliminen empleados con más de 5 años en la empresa.
  2. 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;