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 pour UPDATE


Sujet :

SQL Procédural MySQL

  1. #1
    Nouveau membre du Club Avatar de benjamin122
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2012
    Messages : 25
    Points : 35
    Points
    35
    Par défaut Trigger pour UPDATE
    Bonjour ,

    Je suis en train de créer mon tout premier trigger sous MYSQL.
    Bien que je n'ai pas d'erreur de syntaxe, j'aimerai avoir l'avis de personnes plus calés que moi .

    Mon trigger est lancé après l'update dans la table product_to_techdata qui contient (id,id_techdata,prix,quantité) ==> il s'agit d'une table créée pour stocker les données d'un fournisseur
    , et avec ce trigger, j'aimerai qu'il me compare le prix et le stock de la table product AVEC le prix et le stock de ma table product_to_techdata.Le but étant simple : Si le stock > 0 et que le prix est inférieur,
    j'aimerai updater l'occurence dans ma table product(son prix, son fournisseur et son stock) .

    Pour résumer , les infos contenues dans la table product_to_techdata sont ajoutés par un script php , et j'aimerai que le SGBD se charge d'écraser le prix s'il est moin cher ainsi que le stock s'il est >0 de la table product_to_techdata vers la table product

    Voici mon trigger
    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
     
    CREATE TRIGGER update_techdata AFTER UPDATE ON product_to_techdata
    FOR EACH ROW
    BEGIN
    DECLARE v_stock integer;
    DECLARE v_price decimal(15,2);
     
    select price,quantity into @v_price,@v_stock from product where product_id = NEW.product_id;
     
    if(@v_price > NEW.price AND @v_stock > 0) THEN
     
    UPDATE product SET price = @v_price , quantity = @v_stock WHERE product_id = NEW.product_id;
    END IF;
     
    END

    Malheureusement , je n'ai pas d'idée pour tester les données recues ( je travaille sur phpmyadmin) et pour résoudre le problème
    Ceux qui ont une idée est la bienvenue

    Merci beaucoup!

    Benjamin122

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Je ne suis pas spécialiste des triggers (j'en ai écrit très peu à ce jour) mais le votre me semble bon, à première vue.

    Malheureusement , je n'ai pas d'idée pour tester les données recues ( je travaille sur phpmyadmin) et pour résoudre le problème
    Ben copiez votre base de production sur une base de test, et tentez de faire une mise à jour par une requête UPDATE et regardez si ça fonctionne.
    Testez aussi les cas qui ne doivent pas mettre à jour le prix dans la table product.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Nouveau membre du Club Avatar de benjamin122
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2012
    Messages : 25
    Points : 35
    Points
    35
    Par défaut
    Bonjour,

    Merci pour la réponse. Bien entendu , si j'effectue l'update manuellement , ça fonctionne. Je crois que le problème vient du select.
    J'aimerai vérifier avant le update ce que contiennent respectivement mes variables v_stock et v_price. Comment faire?
    (Je travaillais essentiellement les triggers sur oracle-sqldevelopper et il suffit d'ajouter une sortie output et je pouvais tester ceux-ci)

    Je remet une version de code amélioré au niveau de la syntaxe et des '`' , sans effet, ça ne marche toujours pas



    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
     
    CREATE TRIGGER update_techdata AFTER UPDATE ON product_to_techdata
    FOR EACH ROW
    BEGIN
    DECLARE v_stock integer;
    DECLARE v_price decimal(15,2);
     
    select `price`,`quantity` into @v_price,@v_stock from `product` where `product_id` = NEW.product_id;
     
    if(@v_price > NEW.price AND @v_stock > 0) THEN
     
    UPDATE `product` SET `price` = @v_price , `quantity` = @v_stock WHERE `product_id` = NEW.product_id;
    END IF;
     
    END

    Merci beaucoup

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Il me semble que sous MySQL, dans les triggers, les variables locales doivent être déclarées ET utilisées sans @.

    Essayez de retirer les @ dans votre code.

    Pour voir le contenu de vos variables, vous pouvez simplement les insérer dans une table créée pour l'occasion (avec par exemple une colonne datetime en plus pour vous y retrouver...)

  5. #5
    Nouveau membre du Club Avatar de benjamin122
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2012
    Messages : 25
    Points : 35
    Points
    35
    Par défaut
    Bonsoir,

    Alors j'ai avancé dans mes recherches mais je n'ai toujours pas trouvé la solution . L'erreur semble étrange Ca doit être un problème interface chaise/clavier
    Plus sérieusement , j'ai testé un insert comme aieeeuuuuu me l'a conseillé et étrangement , les données se stockent bien via le insert mais le update fonctionne a moitié ,
    les 2 champs qui sont updatés avec les variables locales mysql restent inchangé , tandis que le date_modified est bien updaté.

    Curieux de trouver le problème

    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
    DROP TRIGGER IF EXISTS `after_update_techdata`; TRIGGER `after_update_techdata` AFTER UPDATE ON `product_to_techdata` FOR EACH ROW BEGIN
    DECLARE v_stock integer;
    DECLARE v_price decimal(15,2);
     
    select `price`,`quantity` into v_price,v_stock from `product` where `product_id` = NEW.product_id;
     
     
    INSERT INTO error_logs VALUES (10,v_stock,v_price,'yo',NEW.price,NEW.product_id);
     
    if(v_price > NEW.price AND v_stock > 0) THEN
     
    UPDATE `product` SET price = v_price , quantity = v_stock , date_modified = NOW() WHERE `product_id` = NEW.product_id;
    END IF;
     
    END;

    Benjamin122

  6. #6
    Nouveau membre du Club Avatar de benjamin122
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2012
    Messages : 25
    Points : 35
    Points
    35
    Par défaut
    Bonsoir,

    Le problème vient d'une erreur de logique , ...

    Lors du select , je récupère les deux variables et les ré-écrase ensuite , alors que les nouvelles valeurs à updater sont NEW.price et NEW.stock

    Je mets mon code qui fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    BEGIN
    DECLARE v_stock integer;
    DECLARE v_price decimal(15,2);
     
    select `price`,`quantity` into v_price,v_stock from `product` where `product_id` = NEW.product_id;
     
    if(v_price > NEW.price AND v_stock > 0) THEN
     
    UPDATE `product` SET `price` =  NEW.price, `quantity` = NEW.quantity , date_modified = NOW() WHERE `product_id` = NEW.product_id;
    END IF;
     
    END
    Un grand merci à tout ceux qui ont participé


    Benjamin122

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    En effet, comme quoi, plus il y a de code, plus il y a de bugs.
    Il me semble que vous pourriez simplement écrire votre déclencheur ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    BEGIN
     
    UPDATE `product` 
        SET `price` =  NEW.price
        , `quantity` = NEW.quantity 
        , date_modified = NOW() 
        WHERE `product_id` = NEW.product_id;
        AND price > NEW.price 
        AND quantity > 0
    ;
     
    END

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

Discussions similaires

  1. [2008] SQL SERVER - Trigger INSERT/UPDATE pour autre Database
    Par warri0r21 dans le forum Développement
    Réponses: 10
    Dernier message: 20/01/2014, 14h06
  2. Trigger pour Update after (last Update)
    Par LaPanic dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 13/01/2011, 12h00
  3. Utilisation des triggers pour un update (niveau débutant)
    Par bipbip2006 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 03/11/2010, 09h16
  4. Trigger pour un update
    Par Devilstuff dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 08/09/2010, 03h59
  5. trigger pour update autre table
    Par onet dans le forum Langage SQL
    Réponses: 1
    Dernier message: 12/05/2009, 08h59

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