Synchroniser des tables avec un trigger
dev21
-
swed -
swed -
Bonjour,
je débute dans l'utilisation des triggers Mysql.
Le contexte:
3 bases de données, dans chacune des bdd , une table 'product' avec une colonne 'quantity'.
Le but:
La valeur 'quantity' de chaque table 'product' doivent être synchronisée.
exemple: si update de la table db1.product, mises à jour des tables db2.product, db3.product. Si update de la table db2.product, mises à jour des tables db1.product, db3.product.
J'ai ajouter un trigger sur la table db1.product:
Code :
ma question, si j'adapte le même trigger sur les autres tables comme ceci:
Code :
Code :
, cela va t-il engendrer une boucle infinie ? si oui comment puis-je contourner le problème ?
merci
je débute dans l'utilisation des triggers Mysql.
Le contexte:
3 bases de données, dans chacune des bdd , une table 'product' avec une colonne 'quantity'.
Le but:
La valeur 'quantity' de chaque table 'product' doivent être synchronisée.
exemple: si update de la table db1.product, mises à jour des tables db2.product, db3.product. Si update de la table db2.product, mises à jour des tables db1.product, db3.product.
J'ai ajouter un trigger sur la table db1.product:
Code :
delimiter $$ CREATE TRIGGER SYNCSTOCK AFTER UPDATE ON db1.product IF (NEW.reference != "") THEN FOR EACH ROW BEGIN UPDATE db2.product SET quantity = NEW.quantity WHERE reference = NEW.reference; UPDATE db3.product SET quantity = NEW.quantity WHERE reference = NEW.reference; END IF; END$$ delimiter ;
ma question, si j'adapte le même trigger sur les autres tables comme ceci:
Code :
delimiter $$ CREATE TRIGGER SYNCSTOCK AFTER UPDATE ON db2.product IF (NEW.reference != "") THEN FOR EACH ROW BEGIN UPDATE db1.product SET quantity = NEW.quantity WHERE reference = NEW.reference; UPDATE db3.product SET quantity = NEW.quantity WHERE reference = NEW.reference; END IF; END$$ delimiter ;
Code :
delimiter $$ CREATE TRIGGER SYNCSTOCK AFTER UPDATE ON db3.product IF (NEW.reference != "") THEN FOR EACH ROW BEGIN UPDATE db1.product SET quantity = NEW.quantity WHERE reference = NEW.reference; UPDATE db2.product SET quantity = NEW.quantity WHERE reference = NEW.reference; END IF; END$$ delimiter ;
, cela va t-il engendrer une boucle infinie ? si oui comment puis-je contourner le problème ?
merci
1 réponse
-
Bonjour ;
Oui, celà va engendrer une boucle infinie.
Pour ne plus avoir ce problème de boucle infinie, je te conseille de modifier tes updates comme ça :
UPDATE db2.product SET quantity = NEW.quantity WHERE reference = NEW.reference AND quantity <> NEW.quantity
Je te conseille également de faire l'update seulement si OLD.quantity <> NEW.quantity.
Comme ça, lorsque c'est un autre champ de la table qui est mis à jour, tu ne referas pas un update inutile...
Donc en ajoutant un test IF ( OLD.quantity <> NEW.quantity )
Peut-être faudrait-il aussi remettre en question la pertinence de la structure de la BDD...
Cordialement, M.