Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur de syntaxe sur un trigger

Sujet résolu
    27 janvier 2020 à 14:00:51

    Bonjour à tous,

    j'ai un petit soucis sur mon code, le but étant la mises en place d'une règle de gestion.

    malgré mes renommages, etc .. voici le code sql :

    delimiter |
    
    	create trigger test before insert on `order details` 
    	for each row
    	begin
        
    		declare pays_client varchar(50);
            
    		set @pays_client = (SELECT country from customers 
                                join orders on customers.customerid = orders.customerid 
                                join `order details` on orders.customerid = `order details.customerid`
                                where orders.OrderID = `NEW.order details.OrderID`);
                                
    		declare pays_fournisseur varchar(50);
            
    		set @pays_fournisseur = (SELECT country from suppliers                             
                                     join products on products.supplierID = suppliers.supplierID 
                                     join `order details` on `order details.productID` = products.productID 
                                     where products.productID = `NEW.order details.productID`);                                                                                                                           
                                     
    		if pays_fournisseur!=pays_client then
    			signal sqlstate '40000' set message_text = 'livraison pas possible';
    		end if;
    end|
    
    delimiter ;

    voici le mpd :



    et enfin le script de création de base :

    https://github.com/serakoc/code/blob/master/northwind_MySQL.sql

    merci de votre aide 0:))

    si vous avez besoin de quelques infos que ce soit, demander je suis plutôt actif sur le forum.

    bonne journée à vous.

    • Partager sur Facebook
    • Partager sur Twitter
      27 janvier 2020 à 14:18:51

      Bonjour,

      Tu mélanges variables de session (avec le @ devant) et variables locales (sans le @).

      Soit tu utilises les premières :

      delimiter |
      
      create trigger test before insert on `order details`
      for each row
      begin
      
      set @pays_client = (SELECT country from customers
      join orders on customers.customerid = orders.customerid
      join `order details` on orders.customerid = `order details.customerid`
      where orders.OrderID = NEW.OrderID);
      
      set @pays_fournisseur = (SELECT country from suppliers
      join products on products.supplierID = suppliers.supplierID
      join `order details` on `order details.productID` = products.productID
      where products.productID = NEW.productID);
      
      if @pays_fournisseur!=@pays_client then
      signal sqlstate '40000' set message_text = 'livraison pas possible';
      end if;
      end|
      
      delimiter ;



      Soit tu utilises les secondes :

      delimiter |
      
      create trigger test before insert on `order details`
      for each row
      begin
      
      declare pays_client varchar(50);
      declare pays_fournisseur varchar(50);
      
      set pays_client = (SELECT country from customers
      join orders on customers.customerid = orders.customerid
      join `order details` on orders.customerid = `order details.customerid`
      where orders.OrderID = NEW.OrderID);
      
      set pays_fournisseur = (SELECT country from suppliers
      join products on products.supplierID = suppliers.supplierID
      join `order details` on `order details.productID` = products.productID
      where products.productID = NEW.productID);
      
      if pays_fournisseur!=pays_client then
      signal sqlstate '40000' set message_text = 'livraison pas possible';
      end if;
      end|
      
      delimiter ;

      Mais il ne faut pas les mélanger ... ;)

      -
      Edité par Benzouye 28 janvier 2020 à 8:58:51

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        27 janvier 2020 à 15:10:00

        meric de ta réponse,

        Sa marche, tu viens de me faire découvrir les variables locales et de sessions ^^

        mais du coup lors de l'execution de :

        INSERT INTO `order details` (OrderID, ProductID, UnitPrice, Quantity, Discount) VALUES       (10248, 11, 14.0000, 12, 0);
        

        j'ai une erreur :

        #1054 - Champ 'NEW.order details.OrderID' inconnu dans where clause

        je ne sais pas prendre la valeur actuelle de orderID (celle de la ligne qui a déclencher le trigger)...

        j'ai essayé avec NEW, mais pas simple, car je ne sais pas d'ou vient l'erreur..une idée ?

        merci d'avance pour ta réponse :)

        • Partager sur Facebook
        • Partager sur Twitter
          27 janvier 2020 à 15:36:15

          serakoc a écrit:

          #1054 - Champ 'NEW.order details.OrderID' inconnu dans where clause

          Oui ... je n'avais pas fait attention à cette erreur ...

          Il ne faut pas repréciser le nom de la table, puisque NEW c'est la table ... J'ai édité mon message précédent pour corriger cela ;)

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            28 janvier 2020 à 2:10:15

            code fonctionnel ;D 

            j'ai du remplacer la requete par une autre un peu plus opti (mais sa c'est de mon côté donc :D)

            je te remercie de tes réponses benzouye ;)

            • Partager sur Facebook
            • Partager sur Twitter

            Erreur de syntaxe sur un trigger

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown