Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/09/2008, 15h25   #1
Invité de passage
 
Inscription : septembre 2008
Messages : 2
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 2
Points : 0
Points : 0
Par défaut Erreur de syntaxe dans un trigger

Bonjour à tous,

J'ai fait un trigger qui me permet de remplir la table data en fonction de la modification de la table profil_etudiant.

Le nom des champs est stocké dans la variable nom_colonne. Le but est que si mon old.nom_colonne est différent de mon new.nom_colonne, il fait les instructions.

Mon problème est que je n'arrive pas à lui faire prendre en compte la valeur de la variable nom_colonne.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CREATE TRIGGER `share_logins`.`TGR_PROFIL` BEFORE UPDATE ON `share_logins`.`profil_etudiant`
  FOR EACH ROW BEGIN 
 
  DECLARE i INT DEFAULT 0;
  DECLARE nbCol INT DEFAULT 0;
  DECLARE nom_colonne TEXT DEFAULT '';
  DECLARE myOld TEXT DEFAULT '';
  DECLARE myNew TEXT DEFAULT '';
  SELECT COUNT(*) INTO nbCol FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'profil_etudiant';
     WHILE i < nbCol DO
         SET i = i + 1;
         SELECT column_name INTO nom_colonne FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'profil_etudiant' AND ordinal_position = i ;
         SET myOld = CONCAT('old.', nom_colonne) ; 
         SET myNew = CONCAT(new,'.' , nom_colonne) ; 
         IF myOld <> myNew THEN 
              INSERT INTO DATA(id_user, nomChamp, date, valeur) VALUES (new.id, nom_colonne, now(), myNew);
         END IF;
      END WHILE;  
   END
//

Comme vous pouvez le voir, j'ai essayé avec CONCAT, mais il ne reconnaît plus le new et old. Il me prend le tout comme une string (CONCAT du old) ou me ressort une erreur (CONCAT du new). J'ai essayé les 2 cela ne fonctionne pas.

ça doit être un problème de syntaxe mais là je sèche depuis plusieurs jours dessus

Quelqu'un pourrait-il me dire comment faire pour qu'il prenne new.nom_colonne comme new.adresse (par exemple) et non pas new.nom_colonne?

J'espère avoir réussi à être clair....

Merci de vos réponses!!
bastiii est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2008, 17h10   #2
Membre Expert
 
Avatar de fregolo52
 
Homme
Développeur C
Inscription : août 2004
Messages : 1 460
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur C

Informations forums :
Inscription : août 2004
Messages : 1 460
Points : 2 070
Points : 2 070
Salut moi aussi je galère un peu comme toi avec la syntaxe.

J'ai un peu de mal avec une ligne :
Code :
SET myNew = CONCAT(new,'.' , nom_colonne)
Que vaut new ? Il me semble que c'est le résultat de la requete en cours.

J'ai l'impression que ton test myOld <> myNew es toujours vrai, tu compares 2 chaine de caractères dont la première commence par "old.", c'est sur que la 2e ne commencera jamais par ca.

je n'ai pas testé, mais essaie avec @ :

Code :
CONCAT(new,'.' , @nom_colonne)
Ca peut peut-etre fonctionner.

je ne sais pas ce que c'est que @ mais pour moi, quand je ne le met pas j'ai une erreur dans la création de ma procédure stockée.
fregolo52 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/09/2008, 08h47   #3
Invité de passage
 
Inscription : septembre 2008
Messages : 2
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 2
Points : 0
Points : 0
En fait mon myNew et myOld devrait contenir les valeurs du champs avant et après l'update.

Et là il compare "new.nom_du_champ" et "old.nom_du_champ". Donc ce test retourne effectivement toujours true....

J'ai testé ton exemple, il donne le même résultat. Je suis vraiment coincé là.

Merci quand même Fregolo52.

J'ai aussi tenté PREPARE et EXECUTE mais rien y fait.

Quelqu'un aurait-il encore une idée??
bastiii est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h32.


 
 
 
 
Partenaires

Hébergement Web