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

Oracle Discussion :

Trigger after update : table mutante [10g]


Sujet :

Oracle

  1. #1
    Membre régulier
    Femme Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Août 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier

    Informations forums :
    Inscription : Août 2010
    Messages : 18
    Points : 72
    Points
    72
    Par défaut Trigger after update : table mutante
    Bonjour,
    J'essaye de créer un trigger qui mettrai à jour un champ d'une table suite à la mise à jour de cette dernière.
    Je me retrouve logiquement avec une erreur ORA-04091.

    Pour contourner le problème j'ai précisé les noms des champs mis à jour et à mettre à jour.
    Exemple :
    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 COLLEGE_TR
        AFTER UPDATE
        OF COMMUNE_INSEE
            ON CGEDUCATION.EDUDATA_COLLEGE
            REFERENCING NEW AS NEW OLD AS OLD
            FOR EACH ROW
     DECLARE
     BEGIN
        UPDATE TABLE_COLLEGE
        SET CANTON_INSEE = (
            SELECT INSEE_CANT
            FROM AutreSchéma.Table_COM
            WHERE INSEE_COM = :NEW.COMMUNE_INSEE)
        WHERE ID_COLLEGE = :OLD.ID_COLLEGE;
     END;
    /
    J'ai toujours la même erreur Oracle.
    Mais je ne comprends pas pourquoi car mon trigger fonctionne ainsi :
    lorsque le code insee de la commune est mis à jour, alors je demande la mise à jour du code insee du champ canton.
    En précisant les colonnes je pensais m'en sortir mais non.
    Quelqu'un saurait-il me dire pourquoi ça ne fonctionne pas ?

    Merci de votre aide.

  2. #2
    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
    Bonjour,
    C'est dans la partie tutoriel Oracle

    PS : Pensez à mettre les balises CODE dans vos messages pour les codes SQL
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  3. #3
    Membre régulier
    Femme Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Août 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier

    Informations forums :
    Inscription : Août 2010
    Messages : 18
    Points : 72
    Points
    72
    Par défaut
    J'ai déjà regardé les tuto. Je n'ai pas un bon niveau Oracle et grâce à eux j'ai réussi à créer le script que j'ai envoyé.
    Je mets un message parce que je suis coincée.
    Pourriez-vous me donner une piste ?

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Le 1er problème, c'est que le code présenté n'est pas facilement exploitable, il y a un TABLE_COLLEGE et un AutreSchéma.Table_COM.
    Soit il faut présenter le code exact, soit il faut modifier partout le nom des tables / colonnes.

    Si TABLE_COLLEGE est bien CGEDUCATION.EDUDATA_COLLEGE, essayez peut être avec seulement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT INSEE_CANT into :new.CANTON_INSEE
      FROM AutreSchéma.Table_COM
     WHERE INSEE_COM = :NEW.COMMUNE_INSEE
    A la place de l'update.
    Par ailleurs, le trigger devrait probablement être plutôt un trigger BEFORE UPDATE.

    Sinon merci de fournir le DDL minimum des tables et un petit jeu de test.

  5. #5
    Membre régulier
    Femme Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Août 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier

    Informations forums :
    Inscription : Août 2010
    Messages : 18
    Points : 72
    Points
    72
    Par défaut
    Merci pour ta réponse.
    Je remets mon code modifié (noms des tables, des champs et j'ai ajouté des précisions pour faciliter la compréhension) :
    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 MISE_A_JOUR_CANTONS_TR
        AFTER UPDATE
        OF COMMUNE_INSEE -- Champ contenant le code insee de la commune d'implantation du collège --
        ON Schéma1.TABLE_COLLEGE -- Table des collèges --
        REFERENCING NEW AS NEW OLD AS OLD
        FOR EACH ROW
     DECLARE
     BEGIN
        UPDATE TABLE_COLLEGE -- Mise à jour de la table des collèges --
    	SET CANTON_INSEE = ( -- Mise à jour du champ contenant le code insee du canton --
    		SELECT INSEE_CANTON 
    		FROM Schéma2.TABLE_COMMUNES -- Recherche du code du canton dans la table des Communes du schéma 2 --
    		WHERE CODE_INSEE = :NEW.COMMUNE_INSEE); -- Où le code insee renseigné dans la table des communes = le code insee renseigné dans la table des collèges --
    END;
    /
    Voici le code avec la solution que tu as proposé :
    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 MISE_A_JOUR_CANTONS_TR
        AFTER UPDATE
        OF COMMUNE_INSEE
        ON Schéma1.TABLE_COLLEGE
        REFERENCING NEW AS NEW OLD AS OLD
        FOR EACH ROW
     DECLARE
     BEGIN
    	SELECT INSEE_CANTON 
    	INTO :NEW.CANTON_INSEE
    	FROM Schéma2.TABLE_COMMUNES
    	WHERE CODE_INSEE = :NEW.COMMUNE_INSEE;
     END;
    /
    Problème avec cette seconde solution :
    ORA-04084: cannot change NEW values for this trigger type

    Le trigger ne peux pas être un trigger BEFORE UPDATE.
    Les données des collèges sont importées dans "Schéma1.TABLE_COLLEGE" à la demande de l'utilisatrice.
    C'est un fois qu'elle a mis à jour ses données et les a importées dans la table des collèges que je dois lancer la mise à jour des variables des cantons.

    Merci.

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par sbeauvalet Voir le message
    Le trigger ne peux pas être un trigger BEFORE UPDATE.
    Les données des collèges sont importées dans "Schéma1.TABLE_COLLEGE" à la demande de l'utilisatrice.
    C'est un fois qu'elle a mis à jour ses données et les a importées dans la table des collèges que je dois lancer la mise à jour des variables des cantons.
    Oui et ? Le trigger s'exécute lorsque l'on envoie l'UPDATE, les données à mettre à jour sont donc connues.
    Et il faut un trigger BEFORE pour pouvoir modifier les valeurs de Schéma1.TABLE_COLLEGE.CANTON_INSEE avant l'écriture.

    Par contre il y a peut être un problème sur le SELECT INTO, si jamais il y a plusieurs Schéma2.TABLE_COMMUNES.INSEE_CANTON pour un Schéma2.TABLE_COMMUNES.CODE_INSEE

    Si c'est le cas fournissez un petit jeu de test (pas besoin des schéma et de toutes les colonnes, juste le strict minimum des 2 tables et quelques lignes)

  7. #7
    Membre régulier
    Femme Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Août 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier

    Informations forums :
    Inscription : Août 2010
    Messages : 18
    Points : 72
    Points
    72
    Par défaut
    Si mon trigger est de type "before update", ce dernier va réaliser un update du champ CANTON_INSEE puis la table "Schéma1.TABLE_COLLEGE" sera mise à jour par l'utilisatrice.
    Mais si le champ COMMUNE_INSEE été modifié par cette mise à jour, mon champ CANTON_INSEE ne sera pas juste...
    C'est pour cette raison que je voulais faire un trigger "after upadte".

    Il y a bien un seul code insee canton (Schéma2.TABLE_COMMUNES.INSEE_CANTON) pour un code insee commune (Schéma2.TABLE_COMMUNES.CODE_INSEE) donc pas de soucis à ce niveau.

  8. #8
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par sbeauvalet Voir le message
    Si mon trigger est de type "before update", ce dernier va réaliser un update du champ CANTON_INSEE puis la table "Schéma1.TABLE_COLLEGE" sera mise à jour par l'utilisatrice.
    Mais si le champ COMMUNE_INSEE été modifié par cette mise à jour, mon champ CANTON_INSEE ne sera pas juste...
    C'est pour cette raison que je voulais faire un trigger "after upadte".
    Il est préférable de lire la doc (et de poser des questions si nécessaire) que d'imaginer un fonctionnement basé sur des mots clés...
    Coding Triggers
    Use BEFORE row triggers to modify the row before the row data is written to disk.
    Le trigger porte sur Schéma1.TABLE_COLLEGE
    Donc pour chaque ligne mise à jour par l'utilisatrice, le trigger s'exécutera avant d'écrire les données sur le disque afin de pouvoir modifier à la volée la colonne CANTON_INSEE.
    Après, c'est trop tard les données sont écrites il n'est plus possible de les modifier, un trigger AFTER est utile pour logguer des modifications par exemple car les données ne seront plus modifiées.

    Je me répète donc, il faut un trigger BEFORE.

    Enfin, de toute façon il suffit de tester.

  9. #9
    Membre régulier
    Femme Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Août 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier

    Informations forums :
    Inscription : Août 2010
    Messages : 18
    Points : 72
    Points
    72
    Par défaut
    Effectivement cela fonctionne bien.
    Merci de ton aide.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/07/2014, 11h46
  2. trigger after update et 2 tables
    Par jeorcal dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 07/01/2011, 09h26
  3. Trigger After Update avec la table Deleted vide ?
    Par azur668 dans le forum Développement
    Réponses: 4
    Dernier message: 24/06/2009, 23h41
  4. Trigger After Update
    Par hair_peace dans le forum Oracle
    Réponses: 8
    Dernier message: 23/08/2006, 21h10
  5. TRIGGER After Update
    Par Nounoursonne dans le forum Oracle
    Réponses: 8
    Dernier message: 20/07/2005, 13h33

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