[Résolu] "self-referencing" + TRIGGER => table
Voila, pour faire simple, j'ai une table qui se référence elle-mêmes pour réprésenter un lien de parenté entre ses divers enregistrement. Je veux ajouter une clause comme quoi un élément ne peux pas avoir comme parent un de ses déscendant !!!
Donc je fais un TRIGGER (pour INSERT et UDATE) dans lequel j'accede à la table que je modifie => probleme de table mutante.
Je veux pas passer par une table temporaire et les autres "astuces" ne seblait pas se preter à mon cas (j'ai essayé INSTEAD OF mais ca ne semble pas etre supporté par mon Oracle (9i)).
Voila, si qqun a deja eu ce probleme...
Merci
Voici mon TRIGGER:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| CREATE OR REPLACE TRIGGER TR_CK_P_ENTITES_ID_ENTITE
BEFORE INSERT OR UPDATE
ON P_ENTITES
FOR EACH ROW
DECLARE
laString P_ENTITES.ID_ENTITE%TYPE;
liveLength NUMBER;
leCar VARCHAR2(1);
cpt NUMBER := 0;
leParent P_ENTITES.PARENT%TYPE;
CURSOR monCurseur IS
SELECT ID_ENTITE
from P_ENTITES
START WITH ID_ENTITE = '||:old.ID_ENTITE||'
CONNECT BY PARENT = prior ID_ENTITE;
BEGIN
IF UPDATING THEN
IF (:new.ID_ENTITE != :old.ID_ENTITE) THEN
:new.ID_ENTITE := '';
END IF;
END IF;
laString := :new.ID_ENTITE;
liveLength := LENGTH(laString);
leParent := :new.PARENT;
WHILE cpt<liveLength LOOP
leCar := SUBSTR(laString, cpt, 1);
IF (INSTR('ABCDEFGHIJKLMNOPQRSTUVW0123456789-', leCar)<=0) THEN
:new.ID_ENTITE := '';
END IF;
cpt := cpt+1;
END LOOP;
IF INSERTING THEN
:new.PARENT:= :new.PARENT;
END IF;
IF UPDATING THEN
OPEN monCurseur;
FOR monCurseurTmp IN monCurseur LOOP
IF (:new.PARENT=monCurseurTmp.ID_ENTITE) THEN
:new.PARENT := '';
END IF;
END LOOP;
:new.PARENT:='';
END IF;
END; |
Note: je fais aussi un petit test pour voir si le champ ne contient que des majuscules des chiffres et des tirets