Un trigger es una acción automática que MySQL ejecuta cuando ocurre un evento sobre una tabla.
¿Qué problema resuelve?
Permite ejecutar lógica automáticamente ante inserciones, modificaciones o eliminaciones, incluso si la operación proviene de distintas aplicaciones.
¿Cuándo conviene un trigger?
Un trigger es útil cuando una regla debe ejecutarse automáticamente sin importar qué aplicación haya realizado el cambio.
Ejemplos típicos:
- registrar auditorías;
- guardar históricos;
- validar ciertas condiciones;
- mantener datos derivados muy controlados.
La contrapartida es que la lógica queda “oculta” detrás de la operación principal, por eso conviene usarlos con criterio.
Eventos disponibles
INSERTUPDATEDELETE
BEFORE y AFTER
BEFORE: antes del cambio.AFTER: después de que el cambio fue realizado.
Qué valores existen en cada evento
No siempre están disponibles OLD y NEW:
- INSERT: existe
NEW; - UPDATE: existen
OLDyNEW; - DELETE: existe
OLD.
NEW
NEW representa los valores nuevos de la fila.
En un BEFORE INSERT o BEFORE UPDATE incluso podemos modificar ciertos valores de NEW antes de que se guarden.
OLD
OLD representa los valores anteriores.
Es especialmente útil para auditorías porque permite comparar qué tenía una columna antes y qué tendrá después.
BEFORE INSERT
DELIMITER // CREATE TRIGGER trg_productos_stock_insert BEFORE INSERT ON productos FOR EACH ROW BEGIN IF NEW.stock < 0 THEN SET NEW.stock = 0; END IF; END // DELIMITER ;
BEFORE INSERT: corregir o rechazar
En el ejemplo anterior elegimos corregir un stock negativo y transformarlo en cero. En otros casos puede ser mejor rechazar la operación con SIGNAL.
Corregir silenciosamente y bloquear con error son decisiones distintas de negocio.
BEFORE UPDATE
Sirve para validar o transformar los nuevos valores antes de guardarlos.
Comparar OLD y NEW
IF OLD.precio <> NEW.precio THEN INSERT INTO precios_auditoria(producto_id, precio_anterior, precio_nuevo) VALUES(NEW.id, OLD.precio, NEW.precio); END IF;
Auditoría con OLD y NEW
Si queremos registrar cambios de precio, podemos guardar ambos valores en una tabla de auditoría. Así queda trazabilidad de qué cambió.
AFTER INSERT
Es útil para auditorías o acciones posteriores al alta.
En AFTER el cambio principal ya ocurrió, por lo que se usa normalmente para registrar consecuencias, no para modificar el valor que se está insertando.
BEFORE DELETE
Podemos guardar un registro histórico antes de eliminar la fila.
SIGNAL
Permite generar un error y bloquear una operación inválida.
IF NEW.stock < 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'El stock no puede ser negativo'; END IF;
FOR EACH ROW
Un trigger se ejecuta una vez por cada fila afectada. Si un UPDATE modifica 10.000 filas, el trigger puede ejecutarse 10.000 veces.
Ver triggers
SHOW TRIGGERS;
Eliminar trigger
DROP TRIGGER IF EXISTS trg_productos_stock_insert;
Triggers dentro de transacciones
Las operaciones que ejecuta un trigger forman parte del mismo contexto transaccional de la sentencia que lo disparó. Si la operación principal se revierte, sus efectos asociados también pueden revertirse según el motor y las tablas involucradas.
Trigger o restricción
Si una regla puede resolverse con NOT NULL, UNIQUE, CHECK o FOREIGN KEY, normalmente esas opciones son más simples y explícitas.
El problema de la lógica oculta
Una sentencia UPDATE puede aparentar modificar una tabla, pero un trigger podría generar efectos adicionales. Por eso deben documentarse bien.
Errores comunes
- usar triggers para todo;
- crear efectos secundarios difíciles de detectar;
- ignorar el costo por fila;
- duplicar reglas que ya existen como restricciones.
Ejercicios
- impedir precios negativos;
- registrar cambios de precio;
- guardar filas antes de DELETE;
- crear historial de stock.
¿Qué sigue?
Normalización de bases de datos.
¿Te sirvió esta guía? ☕
Si este contenido te ayudó y querés apoyar a Club Programador para seguir publicando ejercicios, proyectos y guías gratuitas, podés colaborar mediante:
Ruta SQL / MySQL
Ver todos los contenidos de SQL / MySQL
Normalización de bases de datos →
Descubre más desde Club Programador
Suscríbete y recibe las últimas entradas en tu correo electrónico.
2 opiniones en “Triggers en MySQL: BEFORE, AFTER, INSERT, UPDATE y DELETE con ejemplos”