AFTER INSERT
Un trigger AFTER INSERT se ejecuta después de que una nueva fila se haya insertado exitosamente en la tabla. No puede modificar los valores de NEW porque la inserción ya ocurrió. Es ideal para auditoría, notificaciones y sincronización.
Sintaxis
DELIMITER //
CREATE TRIGGER nombre_trigger
AFTER INSERT ON nombre_tabla
FOR EACH ROW
BEGIN
-- NEW.columna contiene los valores insertados
-- No se puede modificar NEW aquí
END //
DELIMITER ;Auditoría de inserciones
CREATE TABLE IF NOT EXISTS log_actividad (
id INT AUTO_INCREMENT PRIMARY KEY,
tabla_afectada VARCHAR(50),
accion VARCHAR(10),
registro_id INT,
detalle VARCHAR(500),
usuario VARCHAR(100),
fecha DATETIME DEFAULT NOW()
);DELIMITER //
CREATE TRIGGER tr_productos_after_insert
AFTER INSERT ON productos
FOR EACH ROW
BEGIN
INSERT INTO log_actividad (tabla_afectada, accion, registro_id, detalle, usuario)
VALUES ('productos', 'INSERT', NEW.id,
CONCAT('Nuevo producto: ', NEW.nombre, ' - Precio: ', NEW.precio),
USER());
END //
DELIMITER ;INSERT INTO productos (nombre, precio, stock, categoria_id, activo)
VALUES ('Monitor UltraWide', 549.99, 15, 7, TRUE);
SELECT * FROM log_actividad WHERE tabla_afectada = 'productos';| id | tabla_afectada | accion | registro_id | detalle | usuario |
|---|---|---|---|---|---|
| 1 | productos | INSERT | 31 | Nuevo producto: Monitor UltraWide - Precio: 549.99 | root@localhost |
Registro de nuevos pedidos
DELIMITER //
CREATE TRIGGER tr_pedidos_after_insert
AFTER INSERT ON pedidos
FOR EACH ROW
BEGIN
INSERT INTO log_actividad (tabla_afectada, accion, registro_id, detalle, usuario)
VALUES ('pedidos', 'INSERT', NEW.id,
CONCAT('Nuevo pedido - Cliente: ', NEW.cliente_id,
' - Total: ', NEW.total,
' - Estado: ', NEW.estado),
USER());
END //
DELIMITER ;AFTER INSERT vs BEFORE INSERT
| Característica | BEFORE INSERT | AFTER INSERT |
|---|---|---|
| Momento | Antes de la inserción | Después de la inserción |
| Modificar NEW | Sí | No |
| AUTO_INCREMENT disponible | No tiene el valor final | Sí, NEW.id tiene el valor |
| Cancelar operación | Sí, con SIGNAL | No, ya se insertó |
| Uso principal | Validación, transformación | Auditoría, sincronización |
Limpieza
DROP TRIGGER IF EXISTS tr_productos_after_insert;
DROP TRIGGER IF EXISTS tr_pedidos_after_insert;
DROP TABLE IF EXISTS log_actividad;
DELETE FROM productos WHERE nombre = 'Monitor UltraWide';En el siguiente artículo veremos los triggers BEFORE UPDATE.
Escrito por Eduardo Lázaro
