Comment interdire une suppression MYSQL avec un Trigger

by Jean-françois JOLY on mar.29, 2010, under Developpement Web

Récemment il s’est posé à moi une problématique très spécifique : Interdire une suppression dans une table qui est potentiellement consultable par plusieurs sources différentes. Bien sur ces sources ont toutes le maximum de droits et peuvent donc effectuer des requètes de suppression. Il se trouve que mystérieusement, des enregistrement de la table disparaissent tous les soirs … Il faut donc trouver une solution pour interdire la suppression dans cette table sans changer les droits. La solution la plus logique est d’utiliser un trigger pour interdire la suppression. Bien sur, sous oracle ou sql server, il aurait suffit de faire un simple RAISERROR u peu de cette manière :

1
2
3
4
5
6
CREATE TRIGGER forbidden_delete BEFORE DELETE ON matable   
FOR EACH ROW    
BEGIN     
RAISERROR ('Suppression interdite sur cette table', 16, 1);    
ROLLBACK TRANSACTION;
END;

Seulement voilà, je ne travaille pas sur du oracle ou du sql server, mais sur du mysql et RAISERROR ça n’existe pas (enfin à ma connaissance) sur la version 5.0.84. Du coup il faut trouver une alternative simple. Après moultes recherches, l’alternative existe : Pour faire échouer la requète de suppression, il faut faire planter le trigger. Si le trigger plante, la requète ne s’effectue pas. Qu’à celà ne tienne, voilà un excellent moyen de faire planter un trigger :

1
2
3
4
5
6
7
8
DELIMITER //
DROP TRIGGER IF EXISTS forbidden_delete//    
CREATE TRIGGER forbidden_delete BEFORE DELETE ON matable
FOR EACH ROW
BEGIN
SELECT 'a' INTO @toto;
SELECT 'b','c' INTO @toto;
END;//

A chaque delete sur la table matable, la requète de suppression va lamentablement échouer car le trigger va échouer.
Voilà c’était l’astuce du jour en espérant qu’elle soit utile à quelqu’un ;-) .

:, , , , ,

4 Commentaires pour cet article

  • Matthieu

    Très MacGyver. J’adore. =P

    Je suis tombé ici en cherchant à faire exactement la même chose, mais j’ai trouvé plus… propre : créer un trigger ‘instead of delete’, qui ne fait… rien. Cela empêche tout autant la suppression, sans générer d’erreur =)

    Astuce du jour (un peu en retard), qui, je l’espère aussi, sera utile à quelqu’un ;-)

  • Cedz

    MacGyver peut être, mais pas bcp plus de solution lorsqu’on veut faire du conditionnel.

    Selon les cas :
    - On veut jouer l’update
    - Ou ne veut pas le jouer (et dans ce cas, ne pas le jouer se résume à faire planter le trigger)

    Preneur si il existe meilleure solution

  • Fabyburf-tool

    Merci pour cette information interessante

  • Jean-Bols

    Bonjour,

    Je confirme que cette astuce est toujours utile en 2011 !

    Merci !

Laisser un commentaire

A la recherche de quelque chose ?

Utiliser ce champs pour faire votre recherche :

Vous n'avez pas trouvé votre bonheur ? N'hésitez pas à contacter l'auteur de ce blog ou alors laissez un commentaire sur un post !

Les liens !

Quelques liens intéressants...

Les archives

Tout, classé par ordre chronologique ...