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 sur un update


Sujet :

SQL Procédural MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 59
    Points : 56
    Points
    56
    Par défaut Trigger sur un update
    Bonsoir,

    Je débarque dans le monde des triggers et je souhaiterais créer une procédure qui s'occuperait de modifier des données lors d'un UPDATE.

    Je possède une table qui contient des liens ordonnés par des positions.

    ex:
    menu0 en 1ere position
    menu1 en 2 ieme position
    menu2 en 3ieme position
    menu3 en 4ieme position

    lorsque je veux modifier la position du menu2 pour le mettre en position 2, je voudrais que tous mes autres menus prennent la bonne position c-a-d

    menu0 en 1ere position
    menu2 en 2ieme position
    menu1 en 3 ieme position
    menu3 en 4ieme position

    si ma logique est bonne, je dois donc avant mon UPDATE additionner de 1 toutes les positions plus grandes ou égales à celle récupérée lors de ma modification.

    dois-je utiliser une boucle dans le trigger pour que tous mes champs >= à la position voulue s'incrémentent de 1 ?

    je ne vois pas trop comment écrire ma procédure

  2. #2
    Membre habitué
    Femme Profil pro
    Database
    Inscrit en
    Juin 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Database

    Informations forums :
    Inscription : Juin 2010
    Messages : 125
    Points : 135
    Points
    135
    Par défaut
    Bonjour,

    Un peu toute récente aussi dans le domaine des procédures mysql, je te propose la solution suivante via un Curseur, je ne doute pas qu'il doit exister une autre solution, plus rapide, plus in, plus... que les vrais pros du sql et de tout le tuttifrutti pourrait faire super rapidement (mais bon faut bien débuter dans la vie!!!)

    Code : 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
    21
    22
    23
    24
    25
    26
    CREATE PROCEDURE `modif`(IN pmenu VARCHAR(10),IN nv_position INT)
    BEGIN
        DECLARE hasMoreRows BOOLEAN default FALSE; 
        DECLARE CONTINUE HANDLER FOR 1329 set hasMoreRows := TRUE;  -- Gestion d'erreur pour fin curseur atteinte
        BEGIN
            DECLARE cur_menu VARCHAR(10);  -- Variable permettant de stocker le contenu du champ "menu" en cours du curseur
            DECLARE cur_position INT;  -- Variable permettant de stocker le contenu du champ "position" en cours du curseur
            DECLARE cur1 CURSOR FOR SELECT menu, position FROM test;  -- Création du curseur
            SELECT position INTO @old_position FROM test WHERE menu = pmenu;  --Stockage de l'ancienne position du menu à modifier
            OPEN cur1;   -- Ouverture du curseur
            CURSOR_LOOP: loop   --Début de la boucle de lecture du curseur
                FETCH cur1 INTO cur_menu, cur_position;  --Instanciation des variables sur enregistrement en cours du curseur
                IF (( hasMoreRows ) OR (cur_position > @old_position))then   -- S'il n'y a plus d'enregistrement dans le curseur et si la position du curseur est supérieur à l'ancienne position 
                    CLOSE cur1;    -- Fermeture du curseur
                    leave cursor_loop;  -- Sortie de la boucle
                END IF;                    
                IF (cur_position = nv_position) THEN  -- Si la position du curseur est égal à la nouvelle (position recherché) 
                    UPDATE test SET menu = pmenu where position = cur_position;   -- On remplace l'ancienne valeur du champ "menu" de la table test par le nouveau menu
                ELSE 
                    IF ((cur_position >= nv_position) AND ((cur_position+1) <= @old_position)) THEN
                        UPDATE test SET menu = cur_menu where position = cur_position + 1; -- Décalage d'une position le champs "menu" par celui contenu dans le curseur mais à position+1
                    END IF;
                END IF;
            END LOOP cursor_loop; -- Sortie de la boucle
        END;
    END
    Bon, je pense qu'une explication s'impose....

    1) On crée un curseur sur la table test (Un curseur SQL représente une zone de mémoire de la base de données où la dernière instruction SQL est stockée.)
    2) Dans une variable de session nommé @old_position on stocke la valeur de l'ancienne position du menu à modifier.
    3) Pour chaque enregistrement du curseur, on teste :
    1 - si l'ancienne position du menu est supérieur à la position actuelle du curseur ou si l'erreur 1329 est levé (j'expliquerai plus bas le coup de 1329), on ferme le curseur et on sort de la boucle..., sinon on poursuit le programme[/I]
    2 - si la position du curseur est la même que la nouvelle position passé en paramètre, alors on change l'intitulé du menu (dans votre exemple, menu1 est remplacé par menu 2)
    3 - si la position du curseur est supérieur ou égal à la nouvelle position et si elle est inférieur à l'ancienne, alors on copie le contenu du champ menu du curseur dans la table test à la position du curseur + 1

    Si l'exception n°1329 n'est pas géré, une erreur sera levé à cause du test cur_position+1 (on test un enregistrement inexistant), donc pour y palier on ajoute la gestion d'erreur avec les lignes :
    DECLARE hasMoreRows BOOLEAN DEFAULT FALSE;
    DECLARE CONTINUE HANDLER FOR 1329 SET hasMoreRows := TRUE;


    Je ne suis pas sur que mon explication soit super clair donc si vous avez des questions n'hésitez pas, par contre le mieux pour comprendre est de tester ce programme dans tout les sens (retiré des if... en rajouter...)

    Bon courage!!!

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 59
    Points : 56
    Points
    56
    Par défaut
    merci lagnio d'avoir pris de ton temps pour m'expliquer le trigger

    Je teste ça dés lundi

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

Discussions similaires

  1. Trigger sur un update
    Par BLJ.CHAUVIN dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 04/08/2011, 13h08
  2. Trigger sur un update
    Par smux dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 30/05/2008, 00h23
  3. Triggers sur on update sans updater
    Par YvesTan dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 13/10/2007, 23h18
  4. TRIGGER avec inserted + UPDATE sur INSERTED
    Par shaka84 dans le forum Développement
    Réponses: 3
    Dernier message: 12/04/2006, 11h26
  5. [Oracle 9i] Triggers sur les updates de tables
    Par zestrellita dans le forum Oracle
    Réponses: 12
    Dernier message: 07/12/2005, 12h32

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