IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Firebird Discussion :

[TRIGGER] Modifier plusieur ligne depuis un trigger UPDATE


Sujet :

SQL Firebird

  1. #1
    Membre actif
    Inscrit en
    Juin 2002
    Messages
    409
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 409
    Points : 234
    Points
    234
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Membre confirmé Avatar de JustMe
    Inscrit en
    Juillet 2002
    Messages
    479
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 479
    Points : 593
    Points
    593
    Par défaut
    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é**

  3. #3
    Membre averti

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    379
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 379
    Points : 376
    Points
    376
    Par défaut
    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"!!

Discussions similaires

  1. Réponses: 10
    Dernier message: 23/01/2012, 17h27
  2. [MySQL] modifier plusieurs lignes en datetime
    Par link.80 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 24/09/2009, 08h33
  3. [MySQL] Modifier plusieurs lignes de tables en meme temps
    Par helrick dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 12/07/2007, 11h18
  4. Trigger sur plusieurs lignes
    Par Jérôme Lambert dans le forum Développement
    Réponses: 2
    Dernier message: 30/11/2006, 23h28
  5. Réponses: 6
    Dernier message: 05/08/2006, 10h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo