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 22/06/2006, 09h28   #1
Futur Membre du Club
 
Inscription : juin 2006
Messages : 35
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 35
Points : 16
Points : 16
Par défaut Problème lors de l'exécution d'un trigger

Bonjour à tous, voici la question : Deux bases de données ont été créées contenant chacune une table, chacune possèdant 3 triggers (insert, update, delete) de même nature de telle sorte que si l'une des tables est mise à jour, l'autre le fait également, en fait les données sont donc les mêmes dans les deux tables. Seulement si une opération Update (par exemple) est faite sur l'une des deux tables un message d'erreur s'affiche :
"#1442 - Can't update table 'table2' in stored function/trigger because it is already used by statement which invoked this stored function/trigger."
Je crois que les triggers correspondant à l'update des deux tables réagissent formant une boucle sans fin. Si c'est le cas y a-t-il un moyen d'y remédier ?
Désolé si le message n'est pas trop clair, c'est la première fois que j'écris sur votre forum donc n'hésitez pas à poser des questions
Voici les triggers pour une table :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
delimiter $$ 
CREATE TRIGGER trg_post1 after INSERT ON base1.table1 
FOR each row 
begin 
INSERT INTO base2.table2 (num, libelle, zone, nb_annee) VALUES (new.code, new.name, new.ville, new.age); 
End $$ 
 
delimiter $$ 
CREATE TRIGGER trg_post2 after UPDATE ON base1.table1 
FOR each row 
begin 
UPDATE base2.table2 SET libelle = new.name, zone = new.ville, nb_annee = new.age WHERE num = old.code; 
End $$ 
 
delimiter $$ 
CREATE TRIGGER trg_post3 after DELETE ON base1.table1 
FOR each row 
begin 
DELETE FROM base2.table2 WHERE num = old.code ; 
End $$
Madoka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2006, 11h00   #2
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 446
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 446
Points : 7 546
Points : 7 546
Tu peux éventuellement tester si la mise à jour n'a pas déjà été faite...
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE TRIGGER trg_post2 
  AFTER UPDATE ON base1.table1 
  FOR EACH ROW 
  BEGIN 
    UPDATE base2.table2 
    SET libelle = new.name
      , zone = new.ville
      , nb_annee = new.age 
    WHERE num = old.code
      AND NOT ( libelle = new.name
          , zone = new.ville
          , nb_annee = new.age
          )
    ; 
  END 
$$
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2006, 09h11   #3
Futur Membre du Club
 
Inscription : juin 2006
Messages : 35
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 35
Points : 16
Points : 16
et bien la commande fonctionne, mais un nouveau message d'erreur apparait lorsque je fais un update, le voici : "Error 1241 (21000) Operand should contain 1 column(s)", la requête était la suivante : Update table1 set name="Kanna" where code = "1"; En tout cas merci de ton aide
Madoka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2006, 11h13   #4
Xo
Expert Confirmé
 
Avatar de Xo
 
Inscription : janvier 2005
Messages : 2 701
Détails du profil
Informations personnelles :
Âge : 38

Informations forums :
Inscription : janvier 2005
Messages : 2 701
Points : 3 237
Points : 3 237
Envoyer un message via Skype™ à Xo
Un trigger n'existe pas en SQL, merci de préciser quel SGBD vous utilisez SVP, que moi ou un autre modérateur puisse déplacer dans le forum approprié
__________________
"Ce que l'on conçoit bien s'énonce clairement,
Et les mots pour le dire arrivent aisément." Nicolas Boileau

"Expliquer empêche de comprendre si cela dispense de chercher"

Quiz Oracle : venez tester vos connaissances !

La FAQ Oracle : 138 réponses à vos questions
Aidez-nous à la compléter
Xo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2006, 11h26   #5
Futur Membre du Club
 
Inscription : juin 2006
Messages : 35
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 35
Points : 16
Points : 16
Ah désolé , j'utilise Mysql
Madoka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2006, 08h31   #6
Futur Membre du Club
 
Inscription : juin 2006
Messages : 35
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 35
Points : 16
Points : 16
Bon je crois avoir trouvé une solution, pour cela il faudrait que le premier trigger qui s'exécute effectue un select sur l'autre table afin de voir si les données sont différentes et si ce n'est pas le cas, ne pas exécuter le trigger, la syntaxe que al1_24 m'a fourni retourne le même message d'erreur soit "Can't update table 'table2' in stored function/trigger because it is already used by statement which invoked this stored function/trigger", donc voilà je cherche une syntaxe de trigger incluant un select
Madoka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2006, 08h33   #7
Futur Membre du Club
 
Inscription : juin 2006
Messages : 35
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 35
Points : 16
Points : 16
Bien après plusieurs recherches voici un code qui permet donc de créer un trigger sur chacune des deux tables, si l'update est fait sur l'une, il se fera sur l'autre, et vice-versa :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
delimiter $$
CREATE Procedure updatevalue1 (cletable1 int, out value int)
begin
SELECT count(table2.`cléprimaire2`) INTO value FROM `base2`.`table2` AS table2, `base1`.`table1` AS table1
WHERE cletable1=table2.`cléprimaire2`
AND table2.`cléprimaire2`=table1.`cléprimaire1`
AND (table1.`name`<>table2.`libelle` OR table1.`ville`<>table2.`zone` OR table1.`age`<>table2.`nb_annee`);
//ici ce sont les champs existant dans les deux TABLES, si l'une de ces conditions est respectée, la mise à jour n'a pas été faite, donc ON lance l'update//
end $$
 
delimiter $$ 
Create trigger trg_post2 after Update on `base1`.`table1` 
For each row 
begin 
call updatevalue1 (new.`cléprimaire1`, @valeur);
If @valeur<>0 then
Update `base2`.`table2` set `libelle`= new.`name`, `zone`= new.`ville`, `nb_annee`= new.`age` 
where `cléprimaire2` = new.`cléprimaire1`;
End If;
End $$
La procédure compte si la condition est respectée, elle retourne donc une valeur différente de 0.
Voilà, j'espère que le code est assez clair, sinon n'hésitez pas à poser des questions.
Madoka est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h23.


 
 
 
 
Partenaires

Hébergement Web