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

Heritage

L'entité ADHERENT

Il faut créer un attribut TypeAdherent pour discriminer la population des adhérents.

ADHERENT

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.

INSTRUCTEUR

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.

Arc

Le schéma Entité-Association étendu final devient :

Logical

Lorsque l'on fait du forward engineering, on obtient le modèle relationnel suivant :

Relational

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.

Relational_Arc0

Relational_Arc1

On double-clique sur chaque clé étrangère pour éditeur la valeur de la colonne de descrimination.

Relational_Arc2

Relational_Arc3

Lorsque l'on exporte le fichier DDL, on obtient le code de deux déclencheurs de gestion du OU-EX :

DDLFile

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);


Modifié le: mardi 12 septembre 2017, 11:35