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

EventoBEFOREAFTER
INSERTBEFORE INSERTAFTER INSERT
UPDATEBEFORE UPDATEAFTER UPDATE
DELETEBEFORE DELETEAFTER 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:

ReferenciaINSERTUPDATEDELETE
NEWValores nuevosValores nuevosNo disponible
OLDNo disponibleValores anterioresValores 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;
idproducto_idaccioncampovalor_anteriorvalor_nuevousuario
11UPDATEprecio1299.991349.99root@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 usoTipo recomendado
Auditoría de cambiosAFTER UPDATE, AFTER DELETE
Validación de datosBEFORE INSERT, BEFORE UPDATE
Mantener valores calculadosBEFORE INSERT, BEFORE UPDATE
Sincronizar tablasAFTER INSERT, AFTER UPDATE
Prevenir eliminacionesBEFORE 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