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 :

Ordre d'execution de trigger (pour une table d'audit)


Sujet :

Oracle

  1. #1
    Membre éclairé Avatar de PoichOU
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2006
    Messages : 328
    Par défaut Ordre d'execution de trigger (pour une table d'audit)
    Bonjour,

    Tout d'abord je travaille sous oracle 9. Voici mon problème :
    J'ai 2 tables : AUDIT et IMPORT

    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
    /*==============================================================*/
    /* Table : A_AUDIT                                              */
    /*==============================================================*/
    create table A_AUDIT  (
       ID                   NUMBER(10,0)                    not null,
       FK_IMPORT		NUMBER(10,0)                    not null,
       STATUS		VARCHAR2(10 CHAR)               not null,
       UPDATE_DATE          DATE                            not null,
       constraint PK_A_AUDIT primary key (ID)
    )
    /
     
    /*==============================================================*/
    /* Table : A_IMPORT                                             */
    /*==============================================================*/
    create table A_IMPORT  (
       ID                   NUMBER(10,0)                    not null,
       STATUS		VARCHAR2(10 CHAR)               not null,
       NOM_FICHIER		VARCHAR2(50 CHAR)               not null,
       constraint PK_A_IMPORT primary key (ID)
    )
    /
    J'ai 2 sequences pour gérer les ID :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    create sequence SEQ_A_AUDIT
    increment by 1 start with 1 maxvalue 999 minvalue 1 cache 20
    /
     
    create sequence SEQ_A_IMPORT
    increment by 1 start with 1 maxvalue 999 minvalue 1 cache 20
    /
    l'association des tables et des séquences se fait par des triggers
    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
    create or replace
    TRIGGER TRG_SEQ_A_AUDIT
    BEFORE INSERT ON A_AUDIT
    FOR EACH ROW
    BEGIN  
    IF :NEW.ID IS NULL 
        THEN SELECT SEQ_A_AUDIT.NEXTVAL INTO :NEW.ID FROM DUAL;
    END IF; 
    END;
    /
     
    create or replace
    TRIGGER TRG_SEQ_A_IMPORT
    BEFORE INSERT ON A_IMPORT
    FOR EACH ROW
    BEGIN  
    IF :NEW.ID IS NULL 
        THEN SELECT SEQ_A_IMPORT.NEXTVAL INTO :NEW.ID FROM DUAL;
    END IF; 
    END;
    /

    Je voudrais faire un trigger qui insère une ligne dans la table AUDIT à chaque fois qu'il y a une modification sur la table IMPORT.
    J'ai réussi à le faire pour l'UPDATE mais pas pour l'INSERT !
    Voici mon code :
    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
    create or replace
    TRIGGER TRG_AUDIT_IMPORT
    BEFORE INSERT OR UPDATE ON A_IMPORT
    REFERENCING NEW AS N OLD AS O
    FOR EACH ROW
    BEGIN  
      IF INSERTING THEN
        IF :N.ID IS NULL THEN SELECT 
          SEQ_A_IMPORT.NEXTVAL INTO :N.ID FROM DUAL;
        END IF; 
        INSERT INTO A_AUDIT (FK_IMPORT, STATUS, UPDATE_DATE) values (:N.ID,:N.STATUS,sysdate);
      END IF;
     
      IF UPDATING ('STATUS') THEN
        INSERT INTO A_AUDIT (FK_IMPORT, STATUS, UPDATE_DATE) values (:N.ID,:N.STATUS,sysdate);
      END IF;
    END;
    /
    voici l'erreur que j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Erreur SQL : ORA-02291: violation de contrainte d'intégrité (FRIDEV5.FK_A_AUDIT_REFERENCE_A_IMPORT) - clé parent introuvable
    ORA-06512: à "FRIDEV5.TRG_AUDIT_IMPORT", ligne 6
    ORA-04088: erreur lors d'exécution du déclencheur 'FRIDEV5.TRG_AUDIT_IMPORT'
    02291. 00000 - "integrity constraint (%s.%s) violated - parent key not found"
    *Cause:    A foreign key value has no matching primary key value.
    *Action:   Delete the foreign key or add a matching primary key.
    N'y a-t-il pas un conflit entre TRG_SEQ_A_IMPORT et TRG_AUDIT_IMPORT ? quelle séquence est executée en premier ?

    Merci de votre aide
    PoichOU

  2. #2
    Membre émérite Avatar de Z3phur
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2007
    Messages : 680
    Par défaut
    Bonjour,

    tu ne devrais pas mettre de séquence sur ta table AUDIT car quand tu executes ton trigger insert or update sur ta table import tu mets l'id d'import comme valeur de l'id de audit. Et si avant tu as inséré une ligne dans audit avec la séquence tu as probablement un conflit.

    Je ne sais pas si j'ai été assez clair!!!

    Et dans ton trigger tu veux inserer une ligne dans audit avant qu'elle n'existe dans import.

  3. #3
    Membre éclairé Avatar de PoichOU
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2006
    Messages : 328
    Par défaut
    Salut Z3phur,

    merci de ton aide même si je n'ai pas vraiment compris .
    Citation Envoyé par Z3phur Voir le message
    tu ne devrais pas mettre de séquence sur ta table AUDIT car quand tu executes ton trigger insert or update sur ta table import tu mets l'id d'import comme valeur de l'id de audit.
    Mon trigger (le dernier) est bien sur la table IMPORT, et je mets à jour l'ID de la table IMPORT avec le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    IF :N.ID IS NULL THEN SELECT 
          SEQ_A_IMPORT.NEXTVAL INTO :N.ID FROM DUAL;
        END IF;
    ensuite le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NSERT INTO A_AUDIT (FK_IMPORT, STATUS, UPDATE_DATE) values (:N.ID,:N.STATUS,sysdate);
    fait juste une insertion dans la table AUDIT non ?


    Citation Envoyé par Z3phur Voir le message
    Et dans ton trigger tu veux inserer une ligne dans audit avant qu'elle n'existe dans import.
    Hum, il faut mettre un AFTER INSERT alors ?

  4. #4
    Membre émérite Avatar de Z3phur
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2007
    Messages : 680
    Par défaut
    Citation Envoyé par PoichOU Voir le message
    Salut Z3phur,

    merci de ton aide même si je n'ai pas vraiment compris .


    Mon trigger (le dernier) est bien sur la table IMPORT, et je mets à jour l'ID de la table IMPORT avec le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    IF :N.ID IS NULL THEN SELECT 
          SEQ_A_IMPORT.NEXTVAL INTO :N.ID FROM DUAL;
        END IF;
    Ce code ne met pas à jour ton id de la table import.


    Citation Envoyé par PoichOU Voir le message
    ensuite le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NSERT INTO A_AUDIT (FK_IMPORT, STATUS, UPDATE_DATE) values (:N.ID,:N.STATUS,sysdate);
    fait juste une insertion dans la table AUDIT non ?
    La ligne dans import n'est pas encore insérer

    Citation Envoyé par PoichOU Voir le message
    Hum, il faut mettre un AFTER INSERT alors ?
    oui

  5. #5
    Membre éclairé Avatar de PoichOU
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2006
    Messages : 328
    Par défaut
    Citation Envoyé par PoichOU Voir le message
    Hum, il faut mettre un AFTER INSERT alors ?
    Bah oui ça résoud mon problème !! logique pourtant ...

    merci à toi

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

Discussions similaires

  1. Ordre de sélection des lignes sur une table DB2
    Par Pierre Formosa dans le forum DB2
    Réponses: 1
    Dernier message: 26/04/2006, 20h03
  2. Je n'arrive pas à un treeview pour une table Access
    Par clemasson dans le forum Access
    Réponses: 2
    Dernier message: 01/03/2006, 12h49
  3. lien pour une table qui ne doit pas etre public
    Par raslain dans le forum Oracle
    Réponses: 1
    Dernier message: 12/12/2005, 13h40
  4. Changement de tablespace pour une table
    Par slyv dans le forum Oracle
    Réponses: 5
    Dernier message: 28/04/2005, 20h46
  5. Créer une partition pour une table
    Par Erakis dans le forum SQL Procédural
    Réponses: 22
    Dernier message: 28/02/2005, 18h39

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