Ejemplo de solución para ejercicio propuesto en clase como

Anuncio
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.
Descargar