Conseils pour l'utilisation de l'héritage et de l'arc dans Oracle SQL Developer Data Modeler
Choisir de ne pas utiliser la représentation imbriquée de l'héritage
L'entité ADHERENT
Il faut créer un attribut TypeAdherent pour discriminer la population des adhérents.
L'entité INSTRUCTEUR
Une association d'héritage dans le schéma Entité Association étendu est créé dès que l'on désigne un supertype à l'entité courante.
ARC
On clique sur l'entité ADHERENT puis à l'aide de SHIFT+clic sur la première association d'héritage puis à l'aide de SHIFT+clic sur la seconde association d'héritage : l'icône Arc devient utilisable pour créer l'arc.
Le schéma Entité-Association étendu final devient :
Lorsque l'on fait du forward engineering, on obtient le modèle relationnel suivant :
NB: avec la dernière version d'Oracle SQL Developer Data Modeler, il y
a un bug qui crée 2 arcs. Il faut détruire le second qui résulterait en
la créations de déclencheurs redondants.
Il faut alors éditer l'Arc sur le modèle relationnel pour permettre la génération des déclencheurs du OU-EX.
La colonne de descrimination est à choisir au niveau de l'arc et au niveau de chaque clé étrangère de l'arc.
On double-clique sur chaque clé étrangère pour éditeur la valeur de la colonne de descrimination.
Lorsque l'on exporte le fichier DDL, on obtient le code de deux déclencheurs de gestion du OU-EX :
Le code des deux déclencheurs est le suivant :
CREATE OR REPLACE TRIGGER ARC_FKArc_1_EER_INSTRUCTEUR BEFORE
INSERT OR
UPDATE OF NumAdherent ON EER_INSTRUCTEUR FOR EACH ROW DECLARE d VARCHAR2 (32);
BEGIN
SELECT A.TypeAdherent
INTO d
FROM EER_ADHERENT A
WHERE A.NumAdherent = :new.NumAdherent;
IF (d IS NULL OR d <> 'Instructeur') THEN
raise_application_error(-20223,'FK EER_INSTRUCTEUR_EER_ADHERENT_FK in Table EER_INSTRUCTEUR violates Arc constraint on Table EER_ADHERENT - discriminator column TypeAdherent doesn''t have value ''Instructeur''');
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
WHEN OTHERS THEN
RAISE;
END;
/
CREATE OR REPLACE TRIGGER ARC__EER_ADHERENT_NON_INSTRUCT BEFORE
INSERT OR
UPDATE OF NumAdherent ON EER_ADHERENT_NON_INSTRUCTEUR FOR EACH ROW DECLARE d VARCHAR2 (32);
BEGIN
SELECT A.TypeAdherent
INTO d
FROM EER_ADHERENT A
WHERE A.NumAdherent = :new.NumAdherent;
IF (d IS NULL OR d <> 'Adherent non instructeur') THEN
raise_application_error(-20223,'FK EER_ADHERENT_NON_INSTRUCTEUR_EER_ADHERENT_FK in Table EER_ADHERENT_NON_INSTRUCTEUR violates Arc constraint on Table EER_ADHERENT - discriminator column TypeAdherent doesn''t have value ''Adherent non instructeur''');
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
WHEN OTHERS THEN
RAISE;
END;
/
Le jeu d'essai de l'exemple adapté est le suivant :
-- Attention : NumAdherent est le premier attribut de EER_ADHERENT_NON_INSTRUCTEUR et de EER_INSTRUCTEUR
INSERT INTO EER_adherent VALUES(1,'DURANT','Michel','VANNES','Adherent non instructeur');
INSERT INTO EER_adherent VALUES(5,'DUBOIS','Emmanuel','VANNES','Instructeur');
INSERT INTO EER_instructeur VALUES(5,1,12000);
INSERT INTO EER_adherent_non_instructeur VALUES(1,1);
INSERT INTO EER_adherent VALUES(6,'DUBOIS','Michel','VANNES','Instructeur');
INSERT INTO EER_instructeur VALUES(6,2,4000);
INSERT INTO EER_adherent VALUES(2,'DUPONT','Jacques','LORIENT','Adherent non instructeur');
INSERT INTO EER_adherent_non_instructeur VALUES(2,2);
INSERT INTO EER_adherent VALUES(3,'DELMAS','Christian','BREHANT','Adherent non instructeur');
INSERT INTO EER_adherent_non_instructeur VALUES(3,1);
INSERT INTO EER_adherent VALUES(4,'MARTIN','Eric','PONTIVY','Adherent non instructeur');
INSERT INTO EER_adherent_non_instructeur VALUES(4,2);