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 modification d'un champ après un ajout


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 8
    Par défaut TRIGGER modification d'un champ après un ajout
    Bonjour,

    j'essaie de faire un trigger qui quand j'ajoute une vue dans ma table, celui-ci change la valeur d'un champs selon le champs d'une autres table qui est en relation plusieurs a plusieurs je vous mets mon code pour le moment avec l'erreur

    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
     
    CREATE  TRIGGER ajout_mention     
       AFTER INSERT 
       ON produit     
       FOR EACH ROW  
       Begin
         	If  risque.LibelleRisque = 	'H200'OR 'H201'OR 'H202'OR 'H203'OR 'H205'OR 'H224'OR 'H225'OR 'H220'OR 'H222'OR 'H270'OR 'H271'OR 'H240'OR 'H241'OR 'H250'OR 'H251'OR 'H300'OR 
                                                    'H301'OR 'H310'OR 'H330'OR 'H311'OR 'H331'OR 'H370'OR 'H334'OR 'H318'OR 'H304'OR 'H372'OR 'H350'OR 'H340'OR 'H360' 										
            Then
               	update produit SET mention = 2;
        	End if;
    	If  risque.LibelleRisque =	'H204'OR 'H226'OR 'H221'OR 'H223'OR 'H252'OR 'H290'OR 'H280'OR 'H281'OR 'H302'OR 'H312'OR 'H332'OR 'H371'OR 'H335'OR 'H336'OR 'H315'OR 'H319'OR 
                                                    'H317'OR 'H373'OR 'H351'OR 'H341'OR 'H361'OR 'H400'OR 'H410'OR 'H420'Then									
    		update produit SET mention = 1;
    	End if;
      End ;
    et MySQL me répond : #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 9

    je sais même pas si ce que je fais est possible, si oui pouvez vous me dire ou sont mais problème

    merci d'avance pour vos réponse

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    L'erreur est ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If  risque.LibelleRisque = 	'H200'OR 'H201'OR...
    .
    Cette syntaxe est totalement erronée et ne peut être comprise par l'interpréteur.
    Il faudrait écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If  risque.LibelleRisque = 'H200' OR risque.LibelleRisque = 'H201' OR risque.LibelleRisque = ...
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If  risque.LibelleRisque IN ('H200', 'H201', ...)
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 8
    Par défaut
    Merci d'avoir répondu,
    J'ai donc essayé avec votre deuxième syntaxe mais l'erreur reste la même, elle intervient au niveau du UPDATE

  4. #4
    Membre chevronné Avatar de isabelle.letrong
    Femme Profil pro
    Conseil - Consultante en systèmes d'information
    Inscrit en
    Juillet 2010
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Conseil - Consultante en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2010
    Messages : 109
    Par défaut
    Bonjour Duck_ArMyx

    Erreur 1 :
    Tu es dans un trigger AFTER : il est impossible de mettre à jour la table cible du trigger dans un trigger AFTER (puisque la mise à jour a déjà été faite ....)
    => il faut utiliser un trigger BEFORE

    Erreur 2 :
    la table cible du trigger (la table 'produit' référencée après la clause ON) ne se met pas à jour par un UPDATE mais par SET NEW.colonneCible = ...)
    Donc ici il faut remplacer 'update produit SET mention = 2;' par 'SET NEW.mention = 2'

    Bien cordialement.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 8
    Par défaut
    Merci mais malheureusement même avec ces changements le trigger ne fonctionne toujours pas donc je pense modifier ma bdd et l'utilisateur devras rentré les mentions manuellement via un formulaire

    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 13

    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
    CREATE  TRIGGER ajout_mention     
    	BEFORE INSERT 
       ON produit     
       FOR EACH ROW  
       Begin
    		If  risque.LibelleRisque IN ('H200', 'H201', 'H202', 'H203', 'H205', 'H224',
     									'H225', 'H220', 'H222', 'H270', 'H271', 'H240', 
     									'H241', 'H250', 'H251', 'H300', 'H301', 'H310', 
    									'H330', 'H311', 'H331', 'H370', 'H334', 'H318',
     									'H304', 'H372', 'H350', 'H340', 'H360')
     
     			Then
              SET NEW.mention = 2;
       	End if;
    		If  risque.LibelleRisque IN	('H204', 'H226', 'H221', 'H223', 'H252', 'H290',
     									'H280', 'H281', 'H302', 'H312', 'H332', 'H371',
     									'H335', 'H336', 'H315', 'H319', 'H317', 'H373',
     									'H351', 'H341', 'H361', 'H400', 'H410', 'H420')
    		Then									
    			SET NEW.mention = 1;
    		End if;
      End ;

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 599
    Billets dans le blog
    10
    Par défaut
    bonjour,

    Vu le nombre de valeurs à tester, il serait préférable de créer une table associant les listes de valeurs 'H200', 'H201' etc... au code '1' ou '2' recherché, ce sera plus facile à maintenir

  7. #7
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 877
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 877
    Par défaut
    Salut à tous.

    Si vous désirez mettre la liste de vos codes libellés dans le trigger, voici comment vous devez procéder :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `risque`
    --------------
     
    --------------
    CREATE TABLE `risque`
    ( `id`           integer  unsigned  not null auto_increment primary key,
      `libelle`      char(04)           not null
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `risque` (`libelle`) values
      ('H200'),('H221'),('H225'),('H302'),('H332')
    --------------
     
    --------------
    select * from `risque`
    --------------
     
    +----+---------+
    | id | libelle |
    +----+---------+
    |  1 | H200    |
    |  2 | H221    |
    |  3 | H225    |
    |  4 | H302    |
    |  5 | H332    |
    +----+---------+
    --------------
    DROP TABLE IF EXISTS `produit`
    --------------
     
    --------------
    CREATE TABLE `produit`
    ( `id`           integer  unsigned  not null auto_increment primary key,
      `mention`      smallint unsigned  not null,
      `clef`         integer  unsigned  not null,
      CONSTRAINT `FK_risque` FOREIGN KEY (`clef`) REFERENCES `risque` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    DROP TRIGGER IF EXISTS `ajout`
    --------------
     
    --------------
    CREATE TRIGGER `ajout`
    BEFORE INSERT ON `produit`
    FOR EACH ROW
    BEGIN
      DECLARE _code char(04)  default '';
      DECLARE _val  smallint  default 0;
     
      SET _code = (select libelle from `risque` where id = new.clef);
     
      set _val  = case _code when 'H200' then 1  when 'H201' then 1  when 'H202' then 1  when 'H203' then 1  when 'H205' then 1  when 'H224' then 1
                             when 'H225' then 1  when 'H220' then 1  when 'H222' then 1  when 'H270' then 1  when 'H271' then 1  when 'H240' then 1
                             when 'H241' then 1  when 'H250' then 1  when 'H251' then 1  when 'H300' then 1  when 'H301' then 1  when 'H310' then 1
                             when 'H330' then 1  when 'H311' then 2  when 'H331' then 1  when 'H370' then 1  when 'H334' then 1  when 'H318' then 1
                             when 'H304' then 1  when 'H372' then 1  when 'H350' then 1  when 'H340' then 1  when 'H360' then 1
                             when 'H204' then 2  when 'H226' then 2  when 'H221' then 2  when 'H223' then 2  when 'H252' then 2  when 'H290' then 2
                             when 'H280' then 2  when 'H281' then 2  when 'H302' then 2  when 'H312' then 2  when 'H332' then 2  when 'H371' then 2
                             when 'H335' then 2  when 'H336' then 2  when 'H315' then 2  when 'H319' then 2  when 'H317' then 2  when 'H373' then 2
                             when 'H351' then 2  when 'H341' then 2  when 'H361' then 2  when 'H400' then 2  when 'H410' then 2  when 'H420' then 2
                             else 0 end;
     
      set new.mention = _val;
    END
    --------------
     
    --------------
    insert into `produit` (`clef`) values
      (4),(3),(2),(1),(5)
    --------------
     
    --------------
    select * from `produit`
    --------------
     
    +----+---------+------+
    | id | mention | clef |
    +----+---------+------+
    |  1 |       2 |    4 |
    |  2 |       1 |    3 |
    |  3 |       2 |    2 |
    |  4 |       1 |    1 |
    |  5 |       2 |    5 |
    +----+---------+------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
    Appuyez sur une touche pour continuer...
    Maintenant, si la liste de vos codes libellés est longue, le mieux est de créer une table qui à partir de ce code libellé va vous donner la mention que vous rechercher.

    @+

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

Discussions similaires

  1. Modification d'un champ apres une replication
    Par zer_hich dans le forum Réplications
    Réponses: 5
    Dernier message: 13/01/2009, 14h38
  2. [1.x] Modification d'un champs après soumission du formulaire
    Par Slein dans le forum Symfony
    Réponses: 1
    Dernier message: 25/08/2008, 20h32
  3. Réponses: 3
    Dernier message: 10/05/2007, 07h43
  4. lancer un déclencheur aprés la modification d'un champ
    Par fatati dans le forum Administration
    Réponses: 4
    Dernier message: 14/12/2006, 09h52
  5. Réponses: 7
    Dernier message: 04/10/2005, 17h34

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