En entornos donde la integridad de los datos es crítica, como sistemas de facturación o ventas, no siempre basta con asignar permisos de usuario: a veces necesitas impedir directamente que se borren o modifiquen registros en ciertas tablas.
MySQL nos permite hacerlo fácilmente con triggers y el comando SIGNAL.: Por ejemplo, supongamos que tenemos una tabla Venta
donde guardamos todas las ventas. Queremos impedir que se borre cualquier registro. Para lograrlo podemos crear un trigger BEFORE DELETE
así:

CREATE DEFINER=`root`@`%` TRIGGER `Venta_BEFORE_DELETE`
BEFORE DELETE ON `Venta`
FOR EACH ROW
BEGIN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'MD: NO PUEDE BORRAR NINGUNA CUENTA DE ESTA TABLA.';
END;
Qué hace cada parte del Trigger
CREATE DEFINER='root'@'%' TRIGGER ...
Crea un trigger con privilegios del usuarioroot
para cualquier host (%
).BEFORE DELETE ON Venta
Se ejecuta antes de que se borre un registro de la tablaVenta
.FOR EACH ROW
Se dispara una vez por cada fila que se intenta borrar.SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '…';
Lanza una excepción controlada con SQLSTATE45000
(definida por el usuario) y el mensaje de error'MD: NO PUEDE BORRAR NINGUNA CUENTA DE ESTA TABLA.'
.
Con este bloque, cada vez que alguien intente ejecutar un DELETE FROM Venta ...
MySQL detendrá la operación y devolverá un error con tu mensaje personalizado:

Así de simple puedes blindar tus tablas críticas sin tener que modificar permisos de usuario.