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

SQL Procédural MySQL Discussion :

Message d'erreur lors de l'utilisation d'un trigger


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    dev
    Inscrit en
    Juin 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Juin 2014
    Messages : 6
    Par défaut Message d'erreur lors de l'utilisation d'un trigger
    Bonjour,

    Le trigger :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TRIGGER del_pers BEFORE INSERT
    ON routage_pers_tmp
    FOR EACH ROW
    BEGIN
    IF ((SELECT COUNT(A.NUM_CARTE) FROM adherent A WHERE A.NUM_CARTE=NEW.NUM_CARTE)=0)
    THEN
    INSERT INTO routage_pers_tmp SELECT NEW.*;
    END IF;
    END;
    Si le NUM_CARTE de la ligne qu'on tente d'insérer dans routage_pers_tmp n'est pas dans la table adherent, on l'insère.

    Le trigger se crée correctement.

    Mais lors de l'exécution :


    ==> erreur mysql :
    Can't update table 'routage_pers_tmp1' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
    2ème tentative :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TRIGGER del_pers BEFORE INSERT
    ON routage_pers_tmp1
    FOR EACH ROW
    BEGIN
    IF ((SELECT COUNT(A.NUM_CARTE) FROM adherent A WHERE A.NUM_CARTE=NEW.NUM_CARTE)=0)
    THEN
    INSERT INTO routage_pers_tmp2 SELECT NEW.* FROM routage_pers_tmp1;
    END IF;
    END;
    ==> UNknown table NEW.

    Merci de votre aide ...

  2. #2
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    salut,

    utilise la balise code ( # ) pour encadrer ton code.

    je crois que tu n'as pas très bien le principe des triggers sous mysql... regarde ce que dit la doc.

    là tu fais une référence circulaire (ici sur la table sur laquel s'exerce le trigger) avec ton insert dedans, tu ne peux faire des insert/update/delete dans un trigger que s'il porte sur une autre table que celle sur laquelle il est défini... pour mettre à jour une table de log par exemple...

    pour ton test tu dois faire une section declare et y créer une variable du type correspondant à ce qui permet de compter tes adhérents (ou mieux le booleen qui correspond au test) et tu transforme ton select en select...into qui permet de stocker le résultat du count dans la variable et tu fais ton test dessus. tu n'as, en effet, pas le droit de faire de select direct dans un trigger car ça correspond à un affichage.

    pour insert si tu veux modifier une colonne tu modifies la colonne dans la variable spéciale new qui correspond et c'est tout!! il suffit de déclencher une exception si tu veux annuler l'action dans un trigger before...

    ça donnerait:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    delimiter $$
    CREATE TRIGGER del_pers BEFORE INSERT
    ON routage_pers_tmp
    FOR EACH ROW
    begin
      declare t boolean;
      SELECT COUNT(A.NUM_CARTE)>0 into t
      FROM adherent A
      WHERE A.NUM_CARTE=NEW.NUM_CARTE;
      if t then
        select true; -- déclenchera une erreur et donc l'annulation de l'insertion
      end if;
    end$$
    delimiter ;

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    dev
    Inscrit en
    Juin 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Juin 2014
    Messages : 6
    Par défaut Message d'erreur lors de l'utilisation d'un trigger
    Merci pour la réponse.

    J'ai modifié le code pour satisfaire phpmyadmin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    CREATE TRIGGER del_pers BEFORE INSERT
    ON routage_pers_tmp
    FOR EACH ROW
     
    begin
    declare t  boolean;
      SELECT COUNT(A.NUM_CARTE)>0 into t
      FROM adherent A
      WHERE A.NUM_CARTE=NEW.NUM_CARTE;
      if t then
        select true; -- déclenchera une erreur et donc l'annulation de l'insertion
      end if;
    end$$
    Maintenant code d'erreur :
    Not allowed to return a result set from a trigger

    merci

  4. #4
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    donc c'est bon?

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    dev
    Inscrit en
    Juin 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Juin 2014
    Messages : 6
    Par défaut
    Citation Envoyé par ericd69 Voir le message
    donc c'est bon?
    Non message d'erreur :

    Not allowed to return a result set from a trigger

  6. #6
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    tu as quelle version de mysql?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/07/2009, 11h01
  2. Réponses: 15
    Dernier message: 07/04/2008, 08h48
  3. Réponses: 1
    Dernier message: 24/01/2008, 13h20
  4. Message d'erreur lors d'utilisation d'un Objet
    Par dirty_boy dans le forum Langage
    Réponses: 3
    Dernier message: 28/10/2005, 16h16

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