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

PL/SQL Oracle Discussion :

Trigger, problème de table mutante


Sujet :

PL/SQL Oracle

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Trigger, problème de table mutante
    Bonjour,

    Ca fait un moment que je cherche une solution, que je cherche sur le forum mais mon problème persiste.

    J'ai une table de lot (LOT) et une table de frais des lots (FRAISLOT). Pour un lot donné de la table LOT, on peut avoir un ou plusieurs frais dans la table FRAISLOT. Mais on a également la valeur du lot dans la table LOT qui correspond donc à la somme des frais de ce lot.
    Ceci est un existant que je ne peux modifier.
    Pour maintenir à jour la valeur du lot je voulais passer par un trigger qui, dès qu'il y a une modification sur les frais, update la valeur du lot dans la table LOT.

    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
     
    CREATE OR REPLACE TRIGGER TRIG_LOTVAL
    AFTER INSERT OR UPDATE OR DELETE ON FRAISLOT
    FOR EACH ROW
    DECLARE
      n NUMBER;
      TABLE_MUTANTE EXCEPTION;
      PRAGMA EXCEPTION_INIT(TABLE_MUTANTE, -4091);
    BEGIN
      SELECT SUM(PXLVAL) INTO n FROM FRAISLOT WHERE FK_LOT=:NEW.FK_LOT;
      UPDATE LOT SET LOTVAL=n WHERE PK_LOT=:NEW.FK_LOT;
      EXCEPTION
        WHEN TABLE_MUTANTE THEN
        DBMS_OUTPUT.PUT_LINE('Erreur ORA-04091 - TABLE Mutante sans conséquence');
    END;
    Hors il est interdit de faire un select sur une table mutante. J'ai alors pensé passer par une table temporaire où j'insérerais la clé du lot. Puis faire un autre trigger sur cette nouvelle table pour faire le select des frais du lot et faire l'update du lot.

    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
    20
    21
    22
    23
    24
    25
    26
    27
     
    TRIGGER TRIG_LOTVAL
    AFTER INSERT OR UPDATE OR DELETE ON FRAISLOT FOR EACH ROW
    DECLARE
      TABLE_MUTANTE EXCEPTION;
      PRAGMA EXCEPTION_INIT(TABLE_MUTANTE, -4091);
    BEGIN
      INSERT INTO TEMP (FK_LOT) VALUES (:NEW.FK_LOT);
      EXCEPTION
        WHEN TABLE_MUTANTE THEN
        DBMS_OUTPUT.PUT_LINE('Erreur ORA-04091 - TABLE Mutante sans conséquence');
    END;
     
     
    TRIGGER TRIG_LOTVALTEMP
    AFTER INSERT OR UPDATE OR DELETE ON TEMP FOR EACH ROW
    DECLARE
      n NUMBER;
      TABLE_MUTANTE EXCEPTION;
      PRAGMA EXCEPTION_INIT(TABLE_MUTANTE, -4091);
    BEGIN
      SELECT SUM(PXLVAL) INTO n FROM FRAISLOT WHERE FK_LOT=:NEW.FK_LOT;
      UPDATE LOT SET LOTVAL=n WHERE PK_LOT=:NEW.FK_LOT;
      EXCEPTION
        WHEN TABLE_MUTANTE THEN
        DBMS_OUTPUT.PUT_LINE('Erreur ORA-04091 - TABLE Mutante sans conséquence');
    END;
    Mais non, ça ne fonctionne toujours pas. J'ai l'impression que la table FRAISLOT est encore en mutation.
    Avec les deux méthodes, lorsque je fais un select sur une autre table pour faire un test, tout fonctionne...

    Si quelqu'un a une idée, elle sera la bien venue.

    Merci

  2. #2
    Membre éclairé Avatar de philcero
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Septembre 2007
    Messages
    528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2007
    Messages : 528
    Points : 773
    Points
    773
    Par défaut
    Généralement quand il y a corrélation mathématique de valeurs entre deux table, l'équilibrage est à la charge du logiciel client. Côté Oracle si l'information finale n'est pas vitale pour le processus on se contente d'un recalcul tous les N temps.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update lots wl set wl.total = (select sum(prix) from fraislots wfl where wfl.idlot=wl.id);
    Philippe CEROU,

    Architecte Systèmes & Bases de données.

  3. #3
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    J'avais résolu ce problème en faisant les modifications à la main dans le trigger.
    Si le trigger n'est jamais désactivé, ça ne pose pas de problème.

    Un trigger sur la table FRAISLOT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Si update => update de LOT avec LOTVAL= LOTVAL- :old.PXLVAL + :new.PXLVAL
    Si insert => update de LOT avec LOTVAL= LOTVAL+ :new.PXLVAL
    Si delete => update de LOT avec LOTVAL= LOTVAL- :old.PXLVAL
    Pas de table mutante, pas de select.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  4. #4
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Et bien sur à la création du trigger, initialiser la table de lot comme l'a donné philcero
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    merci pour ces réponses aussi rapides.
    je vais tester dans ce sens.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    c'est bon, ça fonctionne.
    par contre il faut partir du principe que le prix du lot est bon dès le départ car il ne sera pas intégralement re-calculé.
    mais ça fera l'affaire.

    encore merci

  7. #7
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Comme je l'ai rajouté :
    Citation Envoyé par McM Voir le message
    Et bien sur à la création du trigger, initialiser la table de lot comme l'a donné philcero
    Ensuite, faire de temps en temps des vérifs de cohérence
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    oui bien sur, si on veut garder une base fiable on a pas le choix

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [10g] Trigger after update : table mutante
    Par StephSushiSig dans le forum Oracle
    Réponses: 8
    Dernier message: 29/12/2014, 14h37
  2. Réponses: 17
    Dernier message: 15/10/2011, 01h30
  3. Problème de Table mutante sur un trigger
    Par mouad83 dans le forum SQL
    Réponses: 2
    Dernier message: 15/05/2009, 16h25
  4. Problème trigger : table mutante
    Par coboy dans le forum PL/SQL
    Réponses: 0
    Dernier message: 12/12/2008, 11h08
  5. Problème de table mutante !
    Par pep972 dans le forum PL/SQL
    Réponses: 4
    Dernier message: 17/11/2008, 16h48

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