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