Nous tentons d'appliquer une integrité referentiel entre deux tables (CNT et CNU).
un enregistrement CNU(contrat unitaire) peut etre inserer si l'on trouve son contrat (CNT).
pour cela, nous utilisons un trigger.
il est declarer de la sorte et appliquer sur la table cible (CNU):
CREATE OR REPLACE TRIGGER CNU_CONTROLE_CNT
BEFORE INSERT ON CNU_CONTRAT_UNITAIRE
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE
trouver NUMBER:=0 ;
BEGIN
-- vérifivation de la présence du contrat actif
SELECT COUNT(*) INTO trouver
FROM CNT_CONTRAT a
WHERE :new.CNT_CODE = a.CNT_CODE
AND :new.CNU_INV_DEB >= a.CNT_INV_DEB
and :new.CNU_INV_DEB < a.CNT_INV_FIN
;
IF trouver <> 0 THEN
RAISE_APPLICATION_ERROR(-00001,'NAME: Pas de contrat valide dans la table CNT_CONTRAT //END');
END IF;
END CNU_CONTROLE_CNT;
/
Nous nous attendons donc a recuperer les enregistrement rejetés par le trigger (on attend un fonctionnement identique a un rejet sur une PK/FK).
Cependant, le programme effectuant les insert passe en Failed dès qu'on 'tombe' sur un enregistrement ne respectant pas le trigger.
le message d'erreur envoyé est le suivant:
Severity Timestamp Node Thread Message Code Message
ERROR 11/09/2007 17:31:07 node01_rs39 WRITER_1_*_1 WRT_8229 Database errors occurred:
ORA-20011: NAME: Pas de contrat valide dans la table CNT_CONTRAT //END
ORA-06512: à "XOB.CNU_CONTROLE_CNT", ligne 14
ORA-04088: erreur lors d'exécution du déclencheur 'XOB.CNU_CONTROLE_CNT'
Comment peut on contourner le 'Failed' et recuperer les rejets associés au trigger?
Partager