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

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

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Juin 2014
    Messages : 6
    Points : 3
    Points
    3
    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
    Points : 3 295
    Points
    3 295
    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 ;
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

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

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Juin 2014
    Messages : 6
    Points : 3
    Points
    3
    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
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    donc c'est bon?
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

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

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Juin 2014
    Messages : 6
    Points : 3
    Points
    3
    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
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    tu as quelle version de mysql?
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

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

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Juin 2014
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par ericd69 Voir le message
    tu as quelle version de mysql?
    5.0.8

  8. #8
    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
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    donc tu ne peux utiliser signal pour déclencher une exception proprement... à partir de la version 5.5 ça devient plus pratique

    essaye alors un appel sur une procédure bidon:
    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
     
    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
        call bidule; -- déclenchera une erreur et donc l'annulation de l'insertion
      end IF;
    end$$
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

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

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Juin 2014
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par ericd69 Voir le message
    donc tu ne peux utiliser signal pour déclencher une exception proprement... à partir de la version 5.5 ça devient plus pratique

    essaye alors un appel sur une procédure bidon:
    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
     
    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
        call bidule; -- déclenchera une erreur et donc l'annulation de l'insertion
      end IF;
    end$$
    Erreur mysql :

    PROCEDURE test2.bidule does not exist (ce qui est vrai ...)

  10. #10
    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
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    ça te le met dans tout le temps?

    sinon y a un moyen de contourner ça qui devrait marcher... les version antérieures à la 5.5 sont pénible pour ça...

    créer la procédure erreur qui fait juste un select dedans comme ça plus d'erreur permanente (si c'est le cas) mais lors de l'exécution normalement
    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
    15
    16
    17
    18
    19
    20
    delimiter $$
    drop procedure if exists erreur;
    create procedure erreur()
    begin
    select 1;
    end$$
     
    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
        call erreur; -- déclenchera une erreur et donc l'annulation de l'insertion
      end IF;
    end$$
    delimiter ;
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

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

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Juin 2014
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    En créant un eprocédure bidon ça ne marche pas non plus.

    Par contre ce trigger fonctionne :

    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 personnel
    FOR EACH ROW
     
    begin
    declare t  INT;
      SELECT COUNT(A.NUM_CARTE)>0 INTO t
      FROM adherent A
      WHERE A.NUM_CARTE=NEW.NUM_CARTE;
      IF t = 0 then
      INSERT INTO personnel2 (NUM_CARTE,NOM) VALUES (NEW.NUM_CARTE,NEW.NOM);
      end IF;
    end$$
    Le problème est donc résolu pour moi.
    Merci de ton aide.

+ 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