Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
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 28/04/2005, 09h59   #1
Membre actif
 
Inscription : juin 2002
Messages : 379
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 379
Points : 168
Points : 168
Par défaut [TRIGGER] Modifier plusieur ligne depuis un trigger UPDATE

Bonjour,

J'ai une table d'article, compose de plusieurs champs :
TABLEA(Champ A1,Champ A2,Champ A3), A1 Cle primaire.

Dans cette table, je peux avoir des article qui sont "lies" entre eux par le champ A2.
Si je modifie A3, je veux que cette modif soit repercutee dans les autres enregistrements qui lui sont lies.

Alors je fais mon petit trigger before update :
Code :
1
2
3
4
IF (new.A3<>old.A3) then
  UPDATE TABLEA TA
  SET TA.A3 = new.A3
  WHERE TA.A2 = new.A2 AND TA.A1<>new.A1;
et puis je teste, et je tombe sur le message "Too many concurent execution of the same request". Mais oui, suis je bete ! Logique, il tourne en rond !

Et depuis, je cherche le meilleur moyen de faire mon truc.
Et le seul moyen que j'ai trouve, c'est de faire cette operation depuis une procedure stockee, qui serait appeler depuis l'appli. Et ca m'oblige, dans mon appli, a creer explicitement une transaction, et a faire toute une batterie de teste supplementaire pour chaque modif d'enregistrement. Alors que ce cas de figure, est "exceptionnel".

Est ce qu'il y aurait une autre solution ?

Merci d'avance.
kase74 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2005, 14h44   #2
Membre éprouvé
 
Avatar de JustMe
 
Inscription : juillet 2002
Messages : 432
Détails du profil
Informations forums :
Inscription : juillet 2002
Messages : 432
Points : 441
Points : 441
Juste une idée :
Si tu mettais ton trigger sur une vue qui sera identique à ta table et par ce tigger mettre à jour les champs de la table en question tu n'aura pas à ce que je pense ce genre de cycle.
et depuis ton programme tu travail sur la vue quand tu veux que ce trigger se déclenche.
__________________
<On fait la science avec des faits, comme on fait une maison avec des pierres : mais une accumulation de faits n'est pas plus une science qu'un tas de pierres n'est une maison> **Poincaré**
http://www.mobile-tactile.com/
JustMe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2005, 18h15   #3
Membre éclairé
 
Inscription : décembre 2004
Messages : 379
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 379
Points : 304
Points : 304
ton problème est la récursivité, tu update un champ qui déclenche un trigger qui lui change le champ qui redéclenche le trigger...

pour régler cela, il faut utiliser les triggers de type AFTER

les triggers "before" assure la mise à jour en "ligne" et les triggers "after" assure la cascade et cela fonctionnera.

le tout et de prévoir un test qui permet d'arrêter "la remontée" sinon, le système tournera indéfiniment sur la "dernière" ligne

bien sûr les modifs en ligne (before) ne se font pas par un "update"!!! la commande update est à utiliser dans les triggers "after"!!
jean-jacques varvenne 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 10h36.


 
 
 
 
Partenaires

Hébergement Web