Introducción a los triggers
Un trigger es un objeto de base de datos que se ejecuta automáticamente cuando ocurre un evento específico en una tabla: INSERT, UPDATE o DELETE. Los triggers permiten automatizar acciones como auditoría, validación de datos y mantenimiento de tablas derivadas.
¿Qué es un trigger?
Un trigger se asocia a una tabla y se dispara automáticamente cuando se insertan, actualizan o eliminan filas. No se llama manualmente como un procedimiento; MySQL lo ejecuta como respuesta a un evento.
Tipos de triggers
| Evento | BEFORE | AFTER |
|---|---|---|
| INSERT | BEFORE INSERT | AFTER INSERT |
| UPDATE | BEFORE UPDATE | AFTER UPDATE |
| DELETE | BEFORE DELETE | AFTER DELETE |
- BEFORE: Se ejecuta antes de que el cambio se aplique. Puede modificar los valores nuevos o cancelar la operación.
- AFTER: Se ejecuta después de que el cambio se ha aplicado. Ideal para auditoría y acciones derivadas.
Sintaxis básica
DELIMITER //
CREATE TRIGGER nombre_trigger
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON nombre_tabla
FOR EACH ROW
BEGIN
-- Cuerpo del trigger
END //
DELIMITER ;OLD y NEW
Dentro de un trigger, puedes acceder a los valores anteriores y nuevos de la fila:
| Referencia | INSERT | UPDATE | DELETE |
|---|---|---|---|
| NEW | Valores nuevos | Valores nuevos | No disponible |
| OLD | No disponible | Valores anteriores | Valores eliminados |
Primer ejemplo
-- Tabla de auditoría
CREATE TABLE auditoria_productos (
id INT AUTO_INCREMENT PRIMARY KEY,
producto_id INT,
accion VARCHAR(10),
campo VARCHAR(50),
valor_anterior VARCHAR(200),
valor_nuevo VARCHAR(200),
usuario VARCHAR(100),
fecha DATETIME DEFAULT NOW()
);DELIMITER //
CREATE TRIGGER tr_productos_update
AFTER UPDATE ON productos
FOR EACH ROW
BEGIN
IF OLD.precio != NEW.precio THEN
INSERT INTO auditoria_productos (producto_id, accion, campo, valor_anterior, valor_nuevo, usuario)
VALUES (NEW.id, 'UPDATE', 'precio', OLD.precio, NEW.precio, USER());
END IF;
END //
DELIMITER ;-- Al actualizar el precio, el trigger se dispara automáticamente
UPDATE productos SET precio = 1349.99 WHERE id = 1;
SELECT * FROM auditoria_productos;| id | producto_id | accion | campo | valor_anterior | valor_nuevo | usuario |
|---|---|---|---|---|---|---|
| 1 | 1 | UPDATE | precio | 1299.99 | 1349.99 | root@localhost |
-- Restaurar
UPDATE productos SET precio = 1299.99 WHERE id = 1;Restricciones de los triggers
- No pueden devolver result sets con SELECT
- No pueden usar CALL para procedimientos que devuelvan result sets
- No pueden usar transacciones explícitas
- No se activan con CASCADE de claves foráneas
- Solo un trigger por combinación de tabla + evento + momento en MySQL 5.7. En MySQL 8.0 se permiten múltiples.
Cuándo usar triggers
| Caso de uso | Tipo recomendado |
|---|---|
| Auditoría de cambios | AFTER UPDATE, AFTER DELETE |
| Validación de datos | BEFORE INSERT, BEFORE UPDATE |
| Mantener valores calculados | BEFORE INSERT, BEFORE UPDATE |
| Sincronizar tablas | AFTER INSERT, AFTER UPDATE |
| Prevenir eliminaciones | BEFORE DELETE |
Limpieza
DROP TRIGGER IF EXISTS tr_productos_update;
DROP TABLE IF EXISTS auditoria_productos;En los siguientes artículos veremos cada tipo de trigger en detalle, empezando por BEFORE INSERT.
Escrito por Eduardo Lázaro
