Está en la página 1de 13

PARCIAL FINAL DE BASES DE DATOS-SS463

PROFESOR AMILKAR SIERRA ROMANO


JUNIO 26 DE 2021 GRUPO 01-02-03-04

LEONARD ARRIETA CADENA

1) Desarrolle el esquema físico de bases de datos Oracle 18c express para los requerimientos
explicados en el punto, tenga en cuenta lo siguiente. VALE 1.0 PUNTO
NOTA: DEBE CREAR ESQUEMA CON EL USUARIO1 COMO USUARIO PROPIETARIO Y
ADMINISTRALO CON EL USUARIO2(Hacer todos los DML), ES DECIR INSERTAR,
ACTUALIZAR REGISTROS, EJECUTAR BLOQUES
ANONIMOS/PROCEDURES/FUNCIONES/PAQUETES ETC.
NOTA1: NO CREAR LLAVES PRIMARIAS NI FORANEAS.
NOTA2: DEBE HACER SUSTENTACION DEL PARCIAL EN VIDEO CON QUE USUARIO ESTA
TRABAJANDO Y CUALES SON LAS TABLAS QUE PERTENECEN AL USUARIO1 , HAGA USO DE
SENTENCIAS DE SQL EXPLICADO EN CLASES.

a) Crear TABLESPACE
b) ROL
c) Sinónimos
d) Usuarios (usuario1 y Usuario2)
e) Secuencias
f) Procedures
g) Paquetes

2) VALE 4.0 PUNTOS LA ADMINISTRACION DEL ESQUEMA ES CON EL USUARIO2, RECUERDE


DE ASIGNAR LOS PERMISOS, SINONIMOS A LOS USUARIOS, TABLAS Y PROCEDURES.

a) Insertar los datos a las tablas usando PL/SQL.


NOTA: Al insertar los datos a todas las tablas, el estudiante deberá hacer la validación LAS
LLAVES ARTIFICIALES Y/O NATURALES, COMO TAMBIEN LAS REGLA DE INTEGRIDAD
REFERECIAL DEL MODELO PROPUESTO. Esta validación deberá enviando mensaje a la
pantalla, EJEMPLO “EL ALUMNO PEDRO YA EXISTE EN LA BASE DE DATOS”, así deberá ser
en todas las tablas donde haya PK, La Validación de la integridad referencial también
deberá ser validada de la misma forma (con PL-sql).
b) HACIENDO USO DE DISPARADORES CONTROLAR LA POBLACION EN LA TABLA CIUDADES Y
DEPARTAMENTOS. HACER UN TRIGGER POR CADA EVENTO DE TIPO DML. Al INSERTAR,
ACTUALIZAR o BORRAR población de las ciudades llevar el total de población del
DEPARTAMENTO al que pertenece la ciudad. La población del departamento es la suma de
la población de las ciudades que pertenecen a ese departamento.
c) IMPRIMA NOMBRE DEL ALUMNO, NOMBRE DEL PROGRAMA, Y NOMBRE DE LA CIUDAD
DE DND VIENE, PARA AQUELLOS ALUMNOS SEAN MAYORES DE EDAD (EL CAMPO PARA
CALCULAR LA EDAD ES FECHA DE NACIEMIENTO)
d) Crear un disparador para que lleve el control en una tabla BITACORA cuyos atributos son:
usuario, fecha, población actual población nueva y operación ejecutada (insert delete o
update) para cuando de inserte borre o actualice la población en la tabla ciudades

NOTA:
a) TIEMPPO DEL PARCIAL CUATRO (4) HORAS. EMPIEZA A LAS 2PM Y TERMINA A LAS
6PM, tienen 15 minutos adicionales para hacer y enviar video que no sobrepase los
5min.
b) Enviar doc. y video sustentando punto por punto del parcial. MOSTRAR CAMARA EN
LA SUSTENTACION.
c) Use diagrama MODELO RELACIONAL ANEXO PARA DESARROLLAR EL PARCIAL Y
plantear su diseño de la base de datos.

NOTA: La sustentación del parcial no es una lectura secuencial de sentencias.

EXITOS
-- ESTE ES MI USUARIO1--

CREATE TABLESPACE PARCIAL3 DATAFILE


'C:\app\Leonard\product\18.0.0\oradata\XE\XEPDB1\PARCIAL3.DBF' SIZE 100M;

CREATE USER USUARIO_1 IDENTIFIED BY leo12345 DEFAULT TABLESPACE PARCIAL3


TEMPORARY TABLESPACE TEMP;

CREATE USER USUARIO_2 IDENTIFIED BY leo12345 DEFAULT TABLESPACE PARCIAL3


TEMPORARY TABLESPACE TEMP;

-- ESTE ES MI USUARIO1--

-- AQUI CREAMOS NUESTROS ROLES --

CREATE ROLE ROL01;

CREATE ROLE CONSULTA;

GRANT UNLIMITED TABLESPACE TO USUARIO_2;

GRANT DBA TO USUARIO2;

GRANT ROL01 TO USUARIO_1 with admin option;

GRANT CONSULTA TO USUARIO_2;

GRANT CREATE SESSION, CREATE TABLE, CREATE PROCEDURE, CREATE SEQUENCE,

CREATE SYNONYM, CREATE JOB, CREATE PUBLIC SYNONYM, INSERT ANY TABLE,

UPDATE ANY TABLE,CONNECT, SELECT ANY TABLE,DROP ANY TABLE,DROP ANY


PROCEDURE,
DROP ANY SEQUENCE , CREATE ANY TRIGGER, DROP ANY TRIGGER

TO ROL01;

GRANT INSERT ANY TABLE, CREATE SESSION, SELECT ANY TABLE, ALTER SESSION, CREATE
SYNONYM, CREATE SEQUENCE TO CONSULTA;

-- AQUI CREO MIS TABLAS --

CREATE TABLE ALUMNO(ID_ALUMNO VARCHAR2(11) NOT NULL, P_NOMBRE


VARCHAR2(20) NOT NULL, S_NOMBRE VARCHAR2(20),

P_APELLIDO VARCHAR2(20) NOT NULL, S_APELLIDO VARCHAR2(20),ETNIA


VARCHAR2(4),CIUDAD VARCHAR2(4),PROGRAMA VARCHAR2(4),

FECHA_NACIMIENTO DATE);

CREATE TABLE CIUDADES(CIUDAD_COD VARCHAR2(4),CIUDAD_NOMBRE


VARCHAR2(20),POBLACION NUMBER(10));

CREATE TABLE DEPARTAMENTOS(DEPART_COD VARCHAR2(4),DEPART_NOMBRE


VARCHAR2(20),POBLACION NUMBER(10));

CREATE TABLE ETNIA(ETNIA_COD VARCHAR2(4),NOMBRE_ETNIA


VARCHAR2(20),POBLACION NUMBER(10));

CREATE TABLE PROGRAMA(PROGRAMA_COD VARCHAR2(4),PROGRAMA_NOMBRE


VARCHAR2(20),COD_FACULTAD VARCHAR2(4));

CREATE TABLE FACULTADES(COD_FACULTAD VARCHAR2(4), NOMBRE_FACULTAD


VARCHAR2(50));

DROP TABLE ALUMNO;

-- CREAMOS SYNONIMOS --

CREATE SYNONYM ALUMNOS FOR USUARIO_1.ALUMNO;

CREATE SYNONYM CIUDAD FOR USUARIO_1.CIUDADES;

CREATE SYNONYM DEPARTAMENTO FOR USUARIO_1.DEPARTAMENTOS;

CREATE SYNONYM ETNIAS FOR USUARIO_1.ETNIA;


CREATE SYNONYM PROGRAMAS FOR USUARIO_1.PROGRAMA;

CREATE SYNONYM FACULTADE FOR USUARIO_1.FACULTADES;

-- LOS SYNONYMOS PARA LOS PROCEDURES--

CREATE PUBLIC SYNONYM DPTO FOR DEPARTAMENTOS;

drop public synonym insertar_departamentos;

CREATE PUBLIC SYNONYM insertar_alumno FOR insertar_alumno;

CREATE PUBLIC SYNONYM insertar_departamentos FOR insertar_departamentos;

CREATE PUBLIC SYNONYM insertar_etnia FOR insertar_etnia;

CREATE PUBLIC SYNONYM insertar_facultad FOR insertar_facultad;

CREATE PUBLIC SYNONYM insertar_programa FOR insertar_programa;

CREATE PUBLIC SYNONYM insertar_ciudad FOR insertar_ciudad;

-- CREO MIS SECUENCIAS --

CREATE SEQUENCE SEC_CIUDAD

START WITH 1

INCREMENT BY 1

NOCYCLE

CREATE SEQUENCE SEC_DEPARTAMENTO

START WITH 1

INCREMENT BY 1

NOCYCLE

CREATE SEQUENCE SEC_ETNIA

START WITH 1

INCREMENT BY 1
NOCYCLE

CREATE SEQUENCE SEC_PROGRAMA

START WITH 1

INCREMENT BY 1

NOCYCLE

CREATE SEQUENCE SEC_FACULTAD

START WITH 1

INCREMENT BY 1

NOCYCLE

SET SERVEROUT ON;

-- CREO MI PROCEDURE PARA INSERTAR ALUMNO--

CREATE OR REPLACE PROCEDURE insertar_alumno(v_id IN VARCHAR2, v_nom1 IN


VARCHAR2, v_nom2 IN VARCHAR2, v_ape1 IN VARCHAR2,

v_ape2 IN VARCHAR2, v_etnia IN NUMBER, v_ciudad IN NUMBER, v_programa IN


NUMBER, v_nacimiento IN DATE)

IS

v_cont NUMBER := 0;

CURSOR v_ciu IS SELECT * FROM ciudades;

CURSOR v_alum IS SELECT * FROM alumno;

CURSOR v_etn IS SELECT * FROM etnia; ---- ME VAN ALMACENAR TODO DE LAS TABLAS
QUE HE CREADO

CURSOR v_pro IS SELECT * FROM programa;


BEGIN

FOR I IN v_alum LOOP

IF I.ID_ALUMNO != v_id THEN

v_cont := 1; -- NECESITO COMPROBRAR SI EXISTE EN LA TABLA

END IF;

END LOOP;

FOR I IN v_etn LOOP

IF I.etnia_cod = v_etnia THEN

v_cont := 2; -- BUSCO CODIGO DE LA ETNIA PARA CONTADOR =2 PARA


VER LOS PROCESOR SON VALIDOS

END IF;

END LOOP;

FOR I IN v_ciu LOOP

IF I.ciudad_cod = v_ciudad THEN

v_cont := 3;

END IF;

END LOOP;

FOR I IN v_pro LOOP

IF I.programa_cod = v_programa THEN

v_cont := 4;

END IF;

END LOOP;
IF v_cont = 4 THEN

INSERT INTO
alumno(id_alumno,p_nombre,s_nombre,p_apellido,s_apellido,etnia,ciudad,programa,fec
ha_nacimiento)

VALUES(v_id,v_nom1,v_nom2,v_ape1,v_ape2,v_etnia,v_ciudad,v_programa,v_nacimiento
);

END IF;

-- SI ES =4 ME VA PERMITIR INGRESAR LOS VALORES QUE LE ESTOY


MANDANDO

IF v_cont != 4 THEN

DBMS_OUTPUT.PUT_LINE('No Se Puede Guardar Debido A Integridad Referencial


Nula');

END IF;

END insertar_alumno;

CREATE OR replace TRIGGER insert_alumno

before insert on alumnos

for each row

declare

begin

if(inserting)then

update ciudades set poblacion=poblacion+1 where codigo =: NEW.ciudad_codigo;

update etnias set poblacion=poblacion+1 where codigo =: NEW.etnia_codigo;

end if;

end;
-- ACTUALIZA LA ETNIA Y LA POBLACION CUANDO EL CODIGO SEA IGUAL A
CODIGO QUE ESTOY MANDANDO--

-- UN PROCEDURE PARA INSERTAR DEPARTAMENTO --

CREATE OR REPLACE PROCEDURE insertar_departamentos(v_nombre IN VARCHAR2,


v_poblacion IN NUMBER)

IS

v_cont NUMBER:=0;

CURSOR v_depart IS SELECT * FROM departamentos;

BEGIN -- INSERTAR DEPARTAMENTOS

FOR I IN v_depart LOOP

IF I.depart_nombre != v_nombre THEN

INSERT INTO departamentos(depart_cod,depart_nombre,poblacion)

VALUES(SEC_DEPARTAMENTO.nextval,v_nombre,v_poblacion);

v_cont := 1;

END IF;

END LOOP; -- RECORRA EL DEPARTARMENTO Y REVIRIFIQUE QUE NO EXISTA SI


NO, ME DEJE INGRESARLO

IF v_cont = 0 THEN

DBMS_OUTPUT.PUT_LINE('El Departamento Ya Existe');

END IF;

END; -- ESTE PROCEDURE LO UTILIZAMOS PARA LOS DEPARTAMENTOS


REPETIDAS

-- PROCEDURE PARA INSERTAR ETNIA--


CREATE OR REPLACE PROCEDURE insertar_etnia(v_nombre IN VARCHAR2, v_poblacion IN
NUMBER)

IS

v_cont NUMBER:=0;

CURSOR v_etnia IS SELECT * FROM etnia;

BEGIN

FOR I IN v_etnia LOOP

IF I.nombre_etnia != v_nombre THEN

v_cont := 1;

END IF;

END LOOP;

IF v_cont = 1 THEN

INSERT INTO etnia(etnia_cod,nombre_etnia,poblacion)

VALUES(SEC_ETNIA.nextval,v_nombre,v_poblacion);

END IF;

IF v_cont = 0 THEN

DBMS_OUTPUT.PUT_LINE('La Etnia Ya Existe');

END IF;

END; -- ESTE PROCEDURE LO UTILIZAMOS PARA LAS ETNIAS REPETIDAS--

-- PROCEDURE PARA FACULTAD--

CREATE OR REPLACE PROCEDURE insertar_facultad(v_nombre IN VARCHAR2)

IS

v_cont NUMBER :=0;


CURSOR v_facul IS SELECT * FROM facultades;

BEGIN

FOR I IN v_facul LOOP

IF I.nombre_facultad != v_nombre THEN

INSERT INTO facultades(cod_facultad,nombre_facultad)

VALUES(SEC_FACULTAD.nextval,v_nombre);

v_cont := 1;

END IF;

END LOOP;

IF v_cont = 0 THEN

DBMS_OUTPUT.PUT_LINE('La Facultad Ya Existe');

END IF;

END; -- ESTE PROCEDURE LO UTILIZAMOS PARA LAS FACULTADES


REPETIDAS--

--PROCEDURE PARA PROGRAMA--

CREATE OR REPLACE PROCEDURE insertar_programa(v_nombre IN VARCHAR2, v_facultad


IN NUMBER)

IS

v_cont NUMBER :=0;

CURSOR v_pro IS SELECT * FROM programa;

BEGIN

FOR I IN v_pro LOOP

IF I.programa_nombre != v_nombre THEN

INSERT INTO programa(programa_cod,programa_nombre,cod_facultad)


VALUES(SEC_PROGRAMA.nextval,v_nombre,v_facultad);

v_cont := 1;

END IF;

END LOOP;

IF v_cont = 0 THEN

DBMS_OUTPUT.PUT_LINE('El Programa Ya Existe En La Base De Datos');

END IF;

END; --ESTE PROCEDURE ES PARA VER LOS PROGRAMA QUE ESTAN


REPETIDOS

-- PROCEDURE PARA CIUDAD--

CREATE OR REPLACE PROCEDURE insertar_ciudades(v_nombre IN VARCHAR2, v_poblacion


IN NUMBER)

IS

v_cont NUMBER:=0;

CURSOR v_ciu IS SELECT * FROM ciudades;

BEGIN

FOR I IN v_ciu LOOP

IF I.ciudad_nombre != v_nombre THEN

INSERT INTO ciudades(ciudad_cod,ciudad_nombre,poblacion)

VALUES(SEC_CIUDAD.nextval,v_nombre,v_poblacion);

v_cont := 1;

END IF;

END LOOP;
IF v_cont = 0 THEN

DBMS_OUTPUT.PUT_LINE('La Ciudad Ya Existe');

END IF; -- AQUI TAMBIEN BERIFICAMOS QUE LA CIUDAD YA EXISTE--

END;

COMMIT;

También podría gustarte