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 : 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
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!!