Ejemplo de solución para ejercicio propuesto en clase como práctica1. Se ha seleccionado el tema: Unidades administrativas y de las clases que lo conforman se ha seleccionado solo unas pocas. Se ha creado con ArgoUML el modelo UML de la clases y se ha tenido la precaución de que en las asociaciones (relaciones) el nombre fuera corto, que aparezcan la cardinalidad, y los nombres de los relaciones en cada extremo. Se han creado los tipos de datos necesarios. Véase el ejemplo: Una vez definido el modelo, se ha exportado en formato XMI. Se ha accedido al servicio Web disponible en la página: http://modeling-languages.com Se ha seleccionado el archivo XMI, el formato de entrada ArgoUML 0.28, el formato SQL de salida Oracle10g y se ha generado el Script SQL para crear la base de datos. Dado que esta herramienta no soporta los tipos espaciales, ha sido necesario cambiar los tipos VARCHAR(40) de los campos geometry por MDSYS.SDO_GEOMETRY El resultado es el siguiente: -- DDL Script para la generación de la base de datos --Tabla para guardar información de AdministrativeUnit CREATE TABLE AdministrativeUnit_rt( inspireId VARCHAR2(40) NOT NULL , geometry MDSYS.SDO_GEOMETRY , nationalCode VARCHAR2(40) NOT NULL , nationalLevel VARCHAR2(8) CONSTRAINT ck_nationalLevelenum CHECK(nationalLevel IN ('1stOrder','2stOrder','3stOrder','4stOrder','5stOrder','6stOrder')) NOT NULL , country VARCHAR2(40) NOT NULL , name VARCHAR2(40) NOT NULL , nationalLevelName VARCHAR2(40) NOT NULL , residenceOfAuthority VARCHAR2(40) NOT NULL , beginLifespanVersion TIMESTAMP NOT NULL , endLifespanVersion TIMESTAMP NOT NULL , --Atributo para guardar información deupLevLowLevUnit upperLevelUnit VARCHAR2(40) , CONSTRAINT pk_AdministrativeUnit PRIMARY KEY (inspireId) ); --Tabla para guardar información de Condominium CREATE TABLE Condominium_rt( inspireId VARCHAR2(40) NOT NULL , geometry MDSYS.SDO_GEOMETRY , name VARCHAR2(40) , beginLifespanVersion TIMESTAMP NOT NULL , endLifespanVersion TIMESTAMP , CONSTRAINT pk_Condominium PRIMARY KEY (inspireId) ); --Tabla para guardar información de coAdminAdminBy CREATE TABLE coAdminAdminBy_rt( id_pk NUMBER(5) NOT NULL , --Atributo para guardar información decoAdministercoAdminAdminBy coAdminister VARCHAR2(40) NOT NULL , --Atributo para guardar información deadministeredBycoAdminAdminBy administeredBy VARCHAR2(40) NOT NULL , CONSTRAINT pk_coAdminAdminBy PRIMARY KEY (id_pk), CONSTRAINT u_coAdminAdminBy1 UNIQUE (coAdminister,administeredBy) ); --Tabla para guardar información de AdminUnitCond CREATE TABLE AdminUnitCond_rt( id_pk NUMBER(5) NOT NULL , --Atributo para guardar información decondominumAdminUnitCond condominum VARCHAR2(40) NOT NULL , --Atributo para guardar información deadmUnitAdminUnitCond admUnit VARCHAR2(40) NOT NULL , CONSTRAINT pk_AdminUnitCond PRIMARY KEY (id_pk), CONSTRAINT u_AdminUnitCond1 UNIQUE (condominum,admUnit) ); ALTER TABLE AdministrativeUnit_rt ADD CONSTRAINT fk_AdministrativeUnitToAdmini FOREIGN KEY(upperLevelUnit) REFERENCES AdministrativeUnit_rt(inspireId) ; ALTER TABLE coAdminAdminBy_rt ADD CONSTRAINT fk_coAdminAdminByToAdministra FOREIGN KEY(coAdminister) REFERENCES AdministrativeUnit_rt(inspireId) ; ALTER TABLE coAdminAdminBy_rt ADD CONSTRAINT fk_coAdminAdminByToAdministra FOREIGN KEY(administeredBy) REFERENCES AdministrativeUnit_rt(inspireId) ; ALTER TABLE AdminUnitCond_rt ADD CONSTRAINT fk_AdminUnitCondToCondominium FOREIGN KEY(condominum) REFERENCES Condominium_rt(inspireId) ; ALTER TABLE AdminUnitCond_rt ADD CONSTRAINT fk_AdminUnitCondToAdministrat FOREIGN KEY(admUnit) REFERENCES AdministrativeUnit_rt(inspireId) ; -- Creación de los contadores automáticos para las tablas DROP SEQUENCE seq_AdministrativeUnit_rt; CREATE SEQUENCE seq_AdministrativeUnit_rt START WITH 1 INCREMENT BY 1 NOMAXVALUE; CREATE TRIGGER tr_seq_AdministrativeUnit_rt BEFORE INSERT ON AdministrativeUnit_rt FOR EACH ROW BEGIN IF :new.inspireId IS NULL THEN SELECT seq_AdministrativeUnit_rt.nextval INTO :new.inspireId FROM dual; END IF; END; / DROP SEQUENCE seq_Condominium_rt; CREATE SEQUENCE seq_Condominium_rt START WITH 1 INCREMENT BY 1 NOMAXVALUE; CREATE TRIGGER tr_seq_Condominium_rt BEFORE INSERT ON Condominium_rt FOR EACH ROW BEGIN IF :new.inspireId IS NULL THEN SELECT seq_Condominium_rt.nextval INTO :new.inspireId FROM dual; END IF; END; / DROP SEQUENCE seq_coAdminAdminBy_rt; CREATE SEQUENCE seq_coAdminAdminBy_rt START WITH 1 INCREMENT BY 1 NOMAXVALUE; CREATE TRIGGER tr_seq_coAdminAdminBy_rt BEFORE INSERT ON coAdminAdminBy_rt FOR EACH ROW BEGIN IF :new.id_pk IS NULL THEN SELECT seq_coAdminAdminBy_rt.nextval INTO :new.id_pk FROM dual; END IF; END; / DROP SEQUENCE seq_AdminUnitCond_rt; CREATE SEQUENCE seq_AdminUnitCond_rt START WITH 1 INCREMENT BY 1 NOMAXVALUE; CREATE TRIGGER tr_seq_AdminUnitCond_rt BEFORE INSERT ON AdminUnitCond_rt FOR EACH ROW BEGIN IF :new.id_pk IS NULL THEN SELECT seq_AdminUnitCond_rt.nextval INTO :new.id_pk FROM dual; END IF; END; / Se ha ejecutado este script en un usuario de Oracle para crear las tablas, las relaciones, etc. Para comprobar que las operaciones se han realizado correctamente, se ha utilizado DBVisualizer y se ha reconstruido el modelo ER gráficamente. Se obtiene como resultado el que se presenta en la siguiente figura.