Bonjour,
Tout d'abord je travaille sous oracle 9. Voici mon problème :
J'ai 2 tables : AUDIT et IMPORT
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
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) ) /
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 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 /
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 :
voici l'erreur que j'ai :
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; /
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 ?
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.
Merci de votre aide
PoichOU
Partager