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 Oracle Discussion :

la table mutante


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Par défaut la table mutante
    hello les gens
    bien qu'avoir parcouru ceci j'avoue toujours ne pas avoir saisi pourqu'oi j'ai cette exception dite de la table mutante.
    je vous livre mon code en espérant que quelques âme charitables sauront m'éclairer.

    deux tables:
    ->vente
    ->rejet
    mon trigger:
    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
    17
    18
    19
     
    CREATE OR REPLACE TRIGGER trg
       BEFORE DELETE                                          -- avant supression.
       ON t_vente
       FOR EACH ROW                                          -- pour chaque ligne.
    BEGIN
       dbms_output.put_line('le declencheur intervient');
       MERGE INTO t_rejets a
          USING t_vente b
          ON (    a.item_key = b.item_key
              )
          WHEN MATCHED THEN
             UPDATE
                SET...
    WHEN NOT MATCHED THEN
             INSERT(item_key...)
             VALUES (:OLD.item_key,...
                        )
    END trg;
    et au niveau de l'execution je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    DELETE
    FROM t_vente;
    le "delete" passe bien, l'appel du declencheur se fait mais pas les INSERT et/ou UPDATE sur la table t_rejets et j'ai un zoli msg d'exception de la table mutante (ORA-04091) en guise de resultat
    merci pour toutes vos contributions

  2. #2
    Membre Expert
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Par défaut
    C'est normal qu'il y ait l'erreur car tu fait une lecture sur ta table t_vente que tu est entrain de modifier, ce qui est interdit.

    Si tu ne seras amené qu'a faire des delete globaux de ta table, alors ne fait pas de trigger-ligne, mais fait un triggier-statement (il faut sortir le "FOR EACH ROW") et là, la lecture sera autorisée, en contre partie tu n'auras pas le droit d'utiliser les :OLD.xxx

  3. #3
    Membre éprouvé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Par défaut
    Je comprend mieux mon problème à present.
    en contre partie tu n'auras pas le droit d'utiliser les :OLD.xxx
    j'en ai besoin comme tu le vois
    j'attends un peu avant de mettre un delestage

  4. #4
    Membre Expert
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Par défaut
    Si tu ne fais que des delete sans aucune clause where, alors tu n'as pas besoin des :old puisque tu traites la globalité des lignes en une seule fois.

    Si tu traites certaines lignes et que tu dois croiser avec d'autres qui sont aussi dans ta table, alors tu peut faire un mix entre un trigger-ligne qui transfère chaque ligne effacée dans une table temporaire, et un trigger-statement qui traite ces lignes à la fin, c'est un peu pénible car tu auras besoin d'une table intermédiare mais ça marche bien.

    Quoi qu'il en soit, je crois qu'il faut que tu fasses un pas en arrière dans ton raisonnement et que tu identifie quel est ton réel besoin fonctionnellement parlant, tu passes peut etre à coté d'une solution plus simple...

  5. #5
    Membre éprouvé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Par défaut
    Si tu ne fais que des delete sans aucune clause where, alors tu n'as pas besoin des :old puisque tu traites la globalité des lignes en une seule fois.
    je ne comprends pas.

    dis moi toi comment tu t'y prendrais pour reporter sur une table t2 des enregistrements avant de les supprimer de la table t1 avec un declencheur quel qu'il soit.
    ça serait super si je pouvais avoir le code de ton trigger car je ne pense pas que je pourrai te suivre sinon.
    merci d'avance

  6. #6
    Membre Expert
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Par défaut
    Citation Envoyé par jadey
    je ne comprends pas.

    dis moi toi comment tu t'y prendrais pour reporter sur une table t2 des enregistrements avant de les supprimer de la table t1 avec un declencheur quel qu'il soit.
    ça serait super si je pouvais avoir le code de ton trigger car je ne pense pas que je pourrai te suivre sinon.
    merci d'avance
    d'apres ce que je comprend, tu n'as donc pas besoin lorsque tu supprimes une ligne d'aller fouiner dans les autres lignes de ta table, l'utilisatistion des valeurs de l'enregistrerement courant est suffisante.


    Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE OR REPLACE TRIGGER trg
       BEFORE DELETE                                          
       ON t_vente
       FOR EACH ROW
    BEGIN
     insert into t_rejets values (:OLD.COL1, :OLD.COL2 etc...);
    END;
    /

Discussions similaires

  1. [10gXE][PL/SQL] trigger + table mutante
    Par <% Bastien %> dans le forum PL/SQL
    Réponses: 5
    Dernier message: 12/04/2007, 14h49
  2. Probleme trigger-tables mutantes
    Par scariou29 dans le forum Administration
    Réponses: 2
    Dernier message: 17/11/2006, 17h13
  3. [pl/sql] Trigger et table mutante
    Par claralavraie dans le forum Oracle
    Réponses: 20
    Dernier message: 18/07/2006, 15h41
  4. Table Mutante
    Par chiheb dans le forum Oracle
    Réponses: 5
    Dernier message: 24/04/2006, 16h22
  5. Réponses: 4
    Dernier message: 30/10/2005, 09h13

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