IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MySQL Discussion :

Empêcher le delete dans un trigger


Sujet :

MySQL

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 25
    Par défaut Empêcher le delete dans un trigger
    Bonjour à tous,

    j'ai créé un trigger qui se déclenche avant le DELETE sur une de mes tables. La question est de savoir comment, sous MySQL, on peut spécifié une erreur, pour empêcher le DELETE, autrement qu'en la provoquant à l'intérieur du trigger. Ou si vous avez une autre idée pour stopper la requête de suppression... je suis preneur.

    Merci bien

    Nicolas

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 287
    Par défaut
    On ne peut pas. L'astuce consiste donc à faire faire un truc interdit au trigger, par exemple insérer un NULL dans une colonne NOT NULL. Cela fera échouer le trigger, qui à son tour fera échouer l'action qui l'a déclenché.

    Je pense que cet article t'intéressera : http://alain-defrance.developpez.com...integre-error/

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 25
    Par défaut
    Après 4heures de recherche sur le net j'ai fini par adopter la même réponse que la tienne. Merci pour le lien, il est effectivement très intéressant, j'étais bien entendu tombé dessus (en 4 heures j'ai eu le temps d'en lire des pages, des tutos, des topics et autres plus ou moins nul ).

    Au final : Effectivement on est d'accord on doit faire passer une erreur déjà existante dans mysql comme ton null dans un not null ou l'appel à une fonction qui n'existe pas. Problème : si quelqu'un à la bonne idée en php de récupéré le libellé de l'erreur ça va lui donné n'importe quoi. Et effectivement c'est un peu crade.

    Du coup ben tant pis, j'abandonne l'idée du trigger au profit de la procédure stockée.

    Hormis si quelqu'un arrive à me donner un exemple qui tourne sous mysql de trigger du style => after update : je supprime la ou les lignes sous certaines conditions. A priori c'est impossible aussi.

    MySQL a de gros progrès à faire dans le domaine des triggers et procédures stockées pour se hisser au niveau d'Oracle.

    A bon entendeur salut,
    Merci beaucoup Antoun,

    Nicolas

  4. #4
    Membre éprouvé
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 509
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 509
    Par défaut
    J'avais déjà posé cette question. En faite, il manque une gestion d'erreur dans Mysql. Du moins pas comme dans SQLServer par exemple.
    Du genre :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IF @toto = 'tata' THEN
      RAISEERROR('houla',16,1)
    Je confirme qu'il faille tenter de faire une erreur volontaire mais bon, c'est du boulot de

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 998
    Billets dans le blog
    6
    Par défaut
    Dans SQL Server il n'y a même pas besoin de lever une exception pour annuler la transaction, car il suffit de lancer un
    ROLLBACK

    En effet selon la norme SQL, tout ordre SQL est une transaction en lui même. De fait le déclencheur et son code font partie intégrante de cette transaction que l'on peut donc valider ou annuler dans le trigger en forçant un ROLLLBACK ou un COMMIT !

    Bien du chemin encore à faire pour MySQL !!!

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. Comment empécher l'exécution dans un trigger ?
    Par CinePhil dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 26/11/2010, 17h13
  2. Annuler un DELETE dans un trigger
    Par khouja dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 07/01/2010, 17h48
  3. delete dans un trigger
    Par madimane dans le forum Oracle
    Réponses: 5
    Dernier message: 16/03/2006, 18h24
  4. DELETE dans un trigger
    Par keuhlu dans le forum Oracle
    Réponses: 2
    Dernier message: 11/03/2006, 18h00
  5. [PL/SQL] Comment contrôler un DELETE dans un TRIGGER ?
    Par PaulBilou dans le forum Oracle
    Réponses: 9
    Dernier message: 30/09/2005, 15h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo