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