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';
idtabla_afectadaaccionregistro_iddetalleusuario
1productosINSERT31Nuevo producto: Monitor UltraWide - Precio: 549.99root@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ísticaBEFORE INSERTAFTER INSERT
MomentoAntes de la inserciónDespués de la inserción
Modificar NEWNo
AUTO_INCREMENT disponibleNo tiene el valor finalSí, NEW.id tiene el valor
Cancelar operaciónSí, con SIGNALNo, ya se insertó
Uso principalValidación, transformaciónAuditorí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