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ística | BEFORE DELETE | AFTER DELETE |
|---|---|---|
| Momento | Antes de la eliminación | Después de la eliminación |
| Cancelar operación | Sí, con SIGNAL | No, ya se eliminó |
| Uso principal | Validación, archivado | Auditoría, sincronización |
| OLD disponible | Sí | Sí |
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
