AFTER DELETE

Un trigger AFTER DELETE se ejecuta después de que una fila ha sido eliminada exitosamente. Tiene acceso a OLD con los valores eliminados. Es ideal para auditoría y actualización de datos derivados.

Sintaxis

DELIMITER //
 
CREATE TRIGGER nombre_trigger
AFTER DELETE ON nombre_tabla
FOR EACH ROW
BEGIN
    -- OLD.columna contiene los valores eliminados
    -- NEW no está disponible
END //
 
DELIMITER ;

Auditoría de eliminaciones

CREATE TABLE IF NOT EXISTS log_eliminaciones (
    id INT AUTO_INCREMENT PRIMARY KEY,
    tabla_afectada VARCHAR(50),
    registro_id INT,
    datos_eliminados TEXT,
    usuario VARCHAR(100),
    fecha DATETIME DEFAULT NOW()
);
DELIMITER //
 
CREATE TRIGGER tr_productos_after_delete
AFTER DELETE ON productos
FOR EACH ROW
BEGIN
    INSERT INTO log_eliminaciones (tabla_afectada, registro_id, datos_eliminados, usuario)
    VALUES ('productos', OLD.id,
            CONCAT('nombre=', OLD.nombre, ', precio=', OLD.precio, ', stock=', OLD.stock),
            USER());
END //
 
DELIMITER ;

Restaurar stock al eliminar detalle

DELIMITER //
 
CREATE TRIGGER tr_detalle_after_delete
AFTER DELETE ON detalle_pedidos
FOR EACH ROW
BEGIN
    -- Restaurar stock del producto
    UPDATE productos
    SET stock = stock + OLD.cantidad
    WHERE id = OLD.producto_id;
 
    -- Actualizar total del pedido
    UPDATE pedidos
    SET total = (SELECT COALESCE(SUM(cantidad * precio_unitario), 0)
                 FROM detalle_pedidos WHERE pedido_id = OLD.pedido_id)
    WHERE id = OLD.pedido_id;
END //
 
DELIMITER ;

Registrar eliminación de reseñas

DELIMITER //
 
CREATE TRIGGER tr_resenas_after_delete
AFTER DELETE ON resenas
FOR EACH ROW
BEGIN
    INSERT INTO log_eliminaciones (tabla_afectada, registro_id, datos_eliminados, usuario)
    VALUES ('resenas', OLD.id,
            CONCAT('producto_id=', OLD.producto_id,
                   ', puntuacion=', OLD.puntuacion,
                   ', comentario=', LEFT(OLD.comentario, 100)),
            USER());
END //
 
DELIMITER ;

AFTER DELETE vs BEFORE DELETE

CaracterísticaBEFORE DELETEAFTER DELETE
MomentoAntes de la eliminaciónDespués de la eliminación
Cancelar operaciónSí, con SIGNALNo, ya se eliminó
Uso principalValidación, archivadoAuditoría, sincronización
OLD disponible

Limpieza

DROP TRIGGER IF EXISTS tr_productos_after_delete;
DROP TRIGGER IF EXISTS tr_detalle_after_delete;
DROP TRIGGER IF EXISTS tr_resenas_after_delete;
DROP TABLE IF EXISTS log_eliminaciones;

En el siguiente artículo veremos cómo listar triggers con SHOW TRIGGERS.

Escrito por Eduardo Lázaro