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

Administration Oracle Discussion :

Probleme trigger-tables mutantes


Sujet :

Administration Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 229
    Par défaut Probleme trigger-tables mutantes
    Bonjour,

    Je dois mettre en place un trigger qui se declenche sur un update d'une table A et doit mettre a jour cette meme table A.
    Je suis donc confronté au problème de table mutante.

    J'ai donc créé une table temporaire B qui stocke les elements mis à jour sur A et j'ai créé un trigger sur insertion sur B qui lui fait la mise a jour finale de A.
    J'ai toujours le meme probleme de table mutante.

    Existe-t-il un moyen de "contourner" le probleme ?

    Code premier trigger

    CREATE OR REPLACE TRIGGER UPDATECNILMAIL
    AFTER UPDATE OF CodeElementStat ON STATS_CLIENT
    REFERENCING NEW AS NEW OLD AS OLD
    FOR EACH ROW
    WHEN (OLD.CodeAxeStat = 47) -- Code Axe Stat Cnil Mail
    BEGIN
    DELETE FROM TEMP_STATS_CLIENT
    WHERE CodeClient = :OLD.CodeClient
    AND CodeAxeStat = 50;

    INSERT INTO TEMP_STATS_CLIENT (CodeClient,CodeAxeStat,ValeurAxeStatistiqueClient)
    VALUES(:OLD.CodeClient,50,sysdate);
    END;

    Code deuxieme trigger :
    CREATE OR REPLACE TRIGGER INSERTTEMPSTATSCLIENT
    BEFORE INSERT ON TEMP_STATS_CLIENT
    REFERENCING NEW AS NEW OLD AS OLD
    FOR EACH ROW
    BEGIN
    update STATS_CLIENT
    set VALEURAXESTATISTIQUECLIENT = :NEW.VALEURAXESTATISTIQUECLIENT
    where CodeClient = :NEW.CodeClient
    and CodeAxeStat = 50; -- Code Axe Stat Date dernière modification CNIL mail
    IF SQL%NOTFOUND THEN
    INSERT INTO STATS_CLIENT (CodeClient,CodeAxeStat,ValeurAxeStatistiqueClient)
    VALUES(:NEW.CodeClient,50,:NEW.VALEURAXESTATISTIQUECLIENT);
    END IF;
    END;

    Merci d'avance pour vos précieuses réponses.

  2. #2
    Xo
    Xo est déconnecté
    Membre Expert
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Par défaut
    Salut,

    jete un oeil à cet article, tu devrais y trouver de quoi résoudre ton problème : Résoudre le problème de la table mutante (ora-04091)
    "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

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 229
    Par défaut
    Merci pour ta réponse.

    J ai effectivement consulté ce tutorial.
    J ai donc modifie mon deuxieme trigger afin que celui-ci se declenche egalement sur mise a jour de la table A

    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
    CREATE OR REPLACE TRIGGER INSERTTEMPSTATSCLIENT
    AFTER UPDATE OF CodeElementStat ON STATS_CLIENT -- Attention toute modif d un codeelemenstat entraine declenchement trigger !!!!!
    REFERENCING NEW AS NEW OLD AS OLD
    --WHEN (OLD.CodeAxeStat = 47) -- Code Axe Stat Cnil Mail
    --FOR EACH ROW
    			BEGIN
    			For ligne in (select * from temp_stats_client)
    			LOOP
    				DELETE FROM STATS_CLIENT
    				where CodeClient = ligne.CodeClient
    				and CodeAxeStat = 50; -- Code Axe Stat Date dernière modification CNIL mail
     
    				INSERT INTO STATS_CLIENT (CodeClient,CodeAxeStat,ValeurAxeStatistiqueClient)
      			VALUES(ligne.CodeClient,50,ligne.VALEURAXESTATISTIQUECLIENT);
      		END LOOP;
    		END;
    Désormais plus de probleme de table mutante.
    Cependant mon trigger se declenche sur TOUTES les mises a jour de ma table A, et je ne peux pas mettre de clause WHEN.
    Comment puis-je modifier mon trigger afin de "filtrer" mon declencheur (a l'image du trigger UPDATECNILMAIL

Discussions similaires

  1. Problème avec un trigger : table mutante
    Par Raiden1234 dans le forum PL/SQL
    Réponses: 8
    Dernier message: 18/12/2008, 14h14
  2. Problème trigger : table mutante
    Par coboy dans le forum PL/SQL
    Réponses: 0
    Dernier message: 12/12/2008, 11h08
  3. [Trigger/table mutante] before ou after INSERT?
    Par rvfranck dans le forum PL/SQL
    Réponses: 0
    Dernier message: 16/10/2008, 19h05
  4. ora 04091 probleme de table mutante
    Par ukanoldai dans le forum SQL
    Réponses: 5
    Dernier message: 10/09/2007, 08h27
  5. [10gXE][PL/SQL] trigger + table mutante
    Par <% Bastien %> dans le forum PL/SQL
    Réponses: 5
    Dernier message: 12/04/2007, 14h49

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