Protege tus tablas y evita eliminaciones accidentales en MySQL con triggers y errores personalizados (SQLSTATE 45000)

Manuales y Tutoriales MySql

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 usuario root para cualquier host (%).
  • BEFORE DELETE ON Venta
    Se ejecuta antes de que se borre un registro de la tabla Venta.
  • 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 SQLSTATE 45000 (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.