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 :

Trigger : Mise à jour d'un champ lors de la modification d'un autre


Sujet :

SQL Procédural MySQL

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 38
    Points : 25
    Points
    25
    Par défaut Trigger : Mise à jour d'un champ lors de la modification d'un autre
    Bonjour,

    Je suis entrain d'écrire un trigger très simple dans le but de mettre le champ "idPerimetrePerso" à null lorsque l'on change l'utilisateur de groupe.

    Je sais faire ça en ORACLE, mais là je dois me mettre à MYSQL et je vois qu'il y a pas mal de différences. L'erreur vient donc surement de là.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    DELIMITER //
    DROP TRIGGER IF EXISTS t_a_u_utilisateurs;
     
    CREATE TRIGGER t_a_u_utilisateurs AFTER UPDATE ON Utilisateurs
    FOR EACH ROW
    BEGIN
    	IF (OLD.idGroupe != NEW.idGroupe) THEN
    		SET NEW.idPerimetrePerso = NULL;
    	END IF;
    END//
    DELIMITER ;
    Je ne comprend pas d'où peut venir le problème :/

    Vous avez une idée ?

    Merci d'avance !

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 161
    Points : 75
    Points
    75
    Par défaut
    Bonjour, il n'y a aucun ordre d'update dans ta requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    IF OLD.idGroupe != NEW.idGroup THEN
         UPDATE taTable SET NEW.idPerimetrePerso = NULL;
    END IF;
    ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE TRIGGER t_a_u_utilisateurs AFTER UPDATE ON Utilisateurs
    signifie juste d'activer un trigger lorsque utilisateurs est modifié

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 38
    Points : 25
    Points
    25
    Par défaut
    Merci pour la réponse rapide

    J'ai donc changé mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    DELIMITER //
    DROP TRIGGER IF EXISTS t_a_u_utilisateurs;
     
    CREATE TRIGGER t_a_u_utilisateurs AFTER UPDATE ON Utilisateurs
    FOR EACH ROW
    BEGIN
    	IF OLD.idGroupe != NEW.idGroupe THEN
    		UPDATE Utilisateurs SET NEW.idPerimetrePerso = NULL;
    	END IF;
    END//
    DELIMITER ;
    J'ai aussi tenté en remplaçant la ligne UPDATE par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UPDATE Utilisateurs SET idPerimetrePerso = NULL WHERE idUtilisateur=NEW.idUtilisateur;
    Et chaque fois ça tourne en boucle, je n'ai même pas de message d'erreur ...

    Lorsque je lance juste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE TRIGGER t_a_u_utilisateurs AFTER UPDATE ON Utilisateurs
    FOR EACH ROW
    BEGIN
    	IF OLD.idGroupe != NEW.idGroupe THEN
    		UPDATE Utilisateurs SET NEW.idPerimetrePerso = NULL;
    	END IF;
    END
    J'ai le message d'erreur suivant :
    requête SQL:

    CREATE TRIGGER t_a_u_utilisateurs AFTER UPDATE ON Utilisateurs FOR EACH ROW BEGIN IF OLD.idGroupe != NEW.idGroupe THEN UPDATE Utilisateurs SET NEW.idPerimetrePerso = NULL ;

    MySQL a répondu:

    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 5
    Mais je suppose que ça vient du fait que le délimiteur attendu est ";" et que mysql pense donc que le trigger se termine après le UPDATE ?

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,


    je penses que votre 1ere méthode devrait marcher, mais avec un trigger BEFORE update

  5. #5
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 38
    Points : 25
    Points
    25
    Par défaut
    J'ai essayé ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    DELIMITER //
    DROP TRIGGER IF EXISTS t_b_u_utilisateurs;
     
    CREATE TRIGGER t_b_u_utilisateurs BEFORE UPDATE ON Utilisateurs
    FOR EACH ROW
    BEGIN
    	IF OLD.idGroupe != NEW.idGroupe THEN
    		SET NEW.idPerimetrePerso = NULL;
    	END IF;
    END;
    //
    DELIMITER ;
    Mais ça ne marche pas non plus. Toujours pareil : quand je compile, ça tourne en boucle et au final ça ne crée rien du tout --'


    EDIT :

    Je viens de voir que dans phpMyAdmin, il y a une case pour définir un délimiter. J'ai donc tenté ça en mettant comme délimiter le caractère "|" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    DROP TRIGGER IF EXISTS t_b_u_utilisateurs;
     
    CREATE TRIGGER t_b_u_utilisateurs BEFORE UPDATE ON Utilisateurs
    FOR EACH ROW
    BEGIN
    	IF OLD.idGroupe != NEW.idGroupe THEN
    		SET NEW.idPerimetrePerso = NULL;
    	END IF;
    END |
    Et là j'ai le message d'erreur suivant :
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CREATE TRIGGER t_b_u_utilisateurs BEFORE UPDATE ON Utilisateurs FOR EACH ROW B' at line 3
    EDIT 2 :

    Bon bah je viens de rééssayer et finalement ça marche, je ne sais pas pourquoi ça n'a pas marché la première fois, mystère ^^
    Donc le problème venait de phpMyAdmin et non du code.

    Merci à vous en tout cas !

Discussions similaires

  1. [Trigger] mise a jour d'un champ lors de l'uptate d'un autre
    Par johnson95 dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 26/10/2009, 17h14
  2. Réponses: 4
    Dernier message: 16/09/2009, 04h23
  3. Réponses: 1
    Dernier message: 23/06/2008, 11h26
  4. Réponses: 5
    Dernier message: 26/12/2007, 14h57
  5. Réponses: 4
    Dernier message: 25/01/2006, 15h42

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