Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Laboratorio 2 ADB

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 10

Laboratorio 2

Restricciones en la Base de Datos PostgreSQL

Objetivo:
El alumno aprenderá restringir (constraint) los campos de una Base de Datos usando los
comando que el SQL tiene para este fin.

Temas de la materia abordados, segun el plan de estudios.

Partes de la que se compone este laboratorio:


● Introducción.
● Creación de tablas usando restricciones.
● Referencias.

Introducción.
El ejercicio que se va a realizar consiste en un problema que describe un problema de una
empresa dedicada a la prestación de servicios educativos: después de leer el texto se genera el diagrama
E-R con la solución a éste problema, se continua con la creación de las tablas.
A continuación se detalla el problema con el que se trabajará en este laboratorio:

Proyecto Universidad ACME


En UACME, se ofrecen dos tipos de cursos en el periodo especial de verano, en el cual se
imparten cursos de verano y cursos extracurriculares. Los primeros son materias que un alumno regular
que estudia una carrera cursa en este periodo, se le permite adelantar hasta dos materias; mientras que
los segundos son cursos especiales de capacitación que se ofrecen a alumnos regulares como
estudiantes o profesionistas externos.
Los docentes de la UACME, son los únicos a los que se les permite impartir estos cursos, por

Administración de Base de Datos - Laboratorio 2


UNACH-Luis Antonio Álvarez Oval
Página 1
los cuales recibe un pago adicional, se les paga de acuerdo a un tabulador que indica el costo de la hora
de estos cursos de acuerdo al nivel académico del docente. El pago se genera a partir de la alta del
curso y solo se permite expedir un cheque por cada curso. Además los estudiantes deben acudir a pagar
adicionalmente al costo del semestre por asistir a ellos.
UACME tiene dos departamentos que intervienen en la administración de los cursos:
A)Departamento de Administración (DA) y B)Departamento de Control Escolar (DCE). Corresponde
al DA, efectuar el pago a los docentes y los cobros a los alumnos. El DA es dirigido por el C.P. Ávila y
es auxiliado por el Sr. Cancino. Mientras que el DCE, es dirigido por el Lic. Barroso y auxiliado por
los Sras. Tirado, Martínez, Aquino y Ramos y es en este donde se decide cuales cursos se imparten en
el periodo, quién los imparte, y se aceptan las solicitudes de los alumnos.
Un caso especial, es el de los Profesores, ya que el DA es quién les puede modificar el sueldo
quincenal, mientras que el DCE ni siquiera puede visualizar éste. Lo curioso radica en que, es el DCE
quién acepta los docentes y los registra en el sistema, pero es el DA donde se captura el sueldo.
Importante es para la administración de la UACME que esta política se aplique al pie de la letra, y
que sea implementado directamente sobre la DB.

Diagrama E/R que resuelve el problema anterior.

Creación de tablas, Inserción de Datos y Administración de Usuarios.


Las tablas que en este punto encuentra se crearon aplicando las reglas de conversión del modelo
E-R al relacional y que se enseñaron en la materia de Diseño de Base de Datos. En caso de alguna duda
recurra a los apuntes y laboratorios de esa materia. Este laboratorio no intenta demostrar esas reglas.

Administración de Base de Datos - Laboratorio 2


UNACH-Luis Antonio Álvarez Oval
Página 2
Esquemas para el diagrama E-R de la Universidad ACME:

CuentaCheques(ncuenta, saldo, banco);


Cheque(ncuenta, cns, total, fecha);
Tabulador(idtab, importehora);
Profesores(idprofe, idtab, nombre, maximo, sueldo);
CursosEspeciales(idcurso, idprofe,cns,fini,ffin);
CursosExtracurricular(idextra, decextra, nhorascurso);
Materias(nmat, des, horacurso);
CEVerano(idcurso, nmat);
CEExtracurricula(idcurso,idextra);
Alumnos(matricula, nombre);
Bimestre(matricula,periodo,nmat,calificacion,faltas);
Faltas(matricula, fecha);
Concepto(idconcepto,desconcepto);
Recibo(folio,matricula,fecharec,totalrec);
DetalleRecibo(folio,cns,idconcepto,subtotal);
CalendarioEscolar(fecha, motivo);

Tablas para el diagrama E-R de la Universidad ACME:


Los siguientes comandos de creación de tablas e inserción de datos deben ser ejecutados usando
el usuarios postgres (el usuario por omisión) y se debe de cambiar de usuario hasta que explicitamente
se le indique. Note que a diferencia del primer laboratorio, en este la creación de tablas usando
restricciones contiene más código, y se debe a que con el uso de restricciones la declaración de las
tablas es mas detallada.

Los lineamientos para la creación de estas restricciones son los siguientes y son entregados por
la gerencia de diseño de sistemas de información de la fábrica de software IAcme.

● Ningún atributo que sea por si mismo llave primaria o sea parte de la llave primaria puede
aceptar valores nulos.
● Cuando un registro del maestro de recibos sea borrado, automáticamente deben ser borrados
todos los registros relacionados en el tabla detalle del recibo.
● Cuando una cuenta de cheques sea borrada, automáticamente deben ser borrados todos los
registros relacionados en la tabla cheques.
● Cuando se elimine un registro de la tabla CursosEspeciales, automáticamente deben ser
borrados cualquier registro relacionado en las tablas especializadas de ceextracurricula y
ceverano.
● NO SE PERMITEN VALORES NULOS sobre los siguientes campos de cada tabla (las llaves
primarias se restringen en el primer lineamiento):
CuentaCheques(banco)
Tabulador(importehora);
Profesores(nombre, maximo);
Materias(des, horacurso);
Alumnos( nombre);

Administración de Base de Datos - Laboratorio 2


UNACH-Luis Antonio Álvarez Oval
Página 3
Concepto(desconcepto);
CalendarioEscolar(motivo);
● NO SE PERMITEN VALORES IGUALES Ó MENORES A CERO sobre los siguientes campos
en las siguientes tablas:
Cheque(total);
Tabulador(importehora);
Profesores(sueldo);
Recibo(totalrec);
DetalleRecibo(subtotal);
● La fecha de emisión del cheque solo puede ser la de hoy ó anterior pero nunca posterior a la
fecha del sistema.

-- Creando la base de datos UACMEREST


create database uacmerest;

-- Cambiarse de la BD por omisión a la ACME (en PSQL)


\c uacmerest

--Creación de las tablas


CREATE TABLE cuentacheques (
ncuenta integer NOT NULL,
saldo numeric(7,2),
banco varchar NOT NULL,
CONSTRAINT cuentacheques_pkey PRIMARY KEY (ncuenta)
);

CREATE TABLE cheque (


ncuenta integer NOT NULL,
cns integer NOT NULL,
total numeric(10,2) CONSTRAINT importe_invalido CHECK ( total > 0 ),
fecha date CONSTRAINT fecha_invalida CHECK (fecha < now() ),
CONSTRAINT cheque_pkey PRIMARY KEY (ncuenta, cns),
CONSTRAINT cheque_ncuenta_fkey FOREIGN KEY (ncuenta)
REFERENCES cuentacheques (ncuenta) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE CASCADE
);

CREATE TABLE tabulador (


idtab integer NOT NULL,
importehora varchar NOT NULL CONSTRAINT importehora_invalido CHECK ( importehora > 0 ),
CONSTRAINT tabulador_pkey PRIMARY KEY (idtab)
);

CREATE TABLE profesores (


idprofe integer NOT NULL,
idtab integer,

Administración de Base de Datos - Laboratorio 2


UNACH-Luis Antonio Álvarez Oval
Página 4
nombre varchar NOT NULL,
maximo varchar NOT NULL,
sueldo double precision CONSTRAINT sueldo_invalido CHECK ( sueldo > 0 ),
CONSTRAINT profesores_pkey PRIMARY KEY (idprofe),
CONSTRAINT profesores_idtab_fkey FOREIGN KEY (idtab)
REFERENCES tabulador (idtab) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
);

CREATE TABLE cursosespeciales (


idcurso integer NOT NULL,
idprofe integer,
fini varchar,
ffin varchar,
ncuenta integer,
cns integer,
CONSTRAINT cursosespeciales_pkey PRIMARY KEY (idcurso),
CONSTRAINT cursosespeciales_ncuenta_fkey FOREIGN KEY (ncuenta, cns)
REFERENCES cheque (ncuenta, cns) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
);

CREATE TABLE cursosextracurricular (


idextra integer NOT NULL,
decextra text,
nhorascurso integer,
CONSTRAINT cursosextracurricular_pkey PRIMARY KEY (idextra)
);

CREATE TABLE materias (


nmat integer NOT NULL,
des varchar NOT NULL,
horacurso integer NOT NULL,
CONSTRAINT materias_pkey PRIMARY KEY (nmat)
);

CREATE TABLE ceverano (


idcurso integer NOT NULL,
nmat integer,
CONSTRAINT ceverano_pkey PRIMARY KEY (idcurso),
CONSTRAINT ceverano_nmat_fkey FOREIGN KEY (nmat)
REFERENCES materias (nmat) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE CASCADE
);

Administración de Base de Datos - Laboratorio 2


UNACH-Luis Antonio Álvarez Oval
Página 5
CREATE TABLE ceextracurricula (
idcurso integer NOT NULL,
idextra integer,
CONSTRAINT ceextracurricula_pkey PRIMARY KEY (idcurso),
CONSTRAINT ceextracurricula_idextra_fkey FOREIGN KEY (idextra)
REFERENCES cursosextracurricular (idextra) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE CASCADE
);

CREATE TABLE alumnos (


matricula integer NOT NULL,
nombre varchar NOT NULL,
CONSTRAINT alumnos_pkey PRIMARY KEY (matricula)
);

CREATE TABLE bimestre (


periodo integer NOT NULL,
matricula integer NOT NULL,
nmat integer,
calificacion integer,
faltas double precision,
CONSTRAINT bimestre_pkey PRIMARY KEY (matricula, periodo),
CONSTRAINT bimestre_matricula_fkey FOREIGN KEY (matricula)
REFERENCES materias (nmat) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT bimestre_matricula_fkey1 FOREIGN KEY (matricula)
REFERENCES alumnos (matricula) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
);

CREATE TABLE faltas (


fecha varchar NOT NULL,
matricula integer,
CONSTRAINT faltas_pkey PRIMARY KEY (fecha),
CONSTRAINT faltas_matricula_fkey FOREIGN KEY (matricula)
REFERENCES alumnos (matricula) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
);

CREATE TABLE concepto (


idconcepto integer NOT NULL,
desconcepto varchar NOT NULL,

Administración de Base de Datos - Laboratorio 2


UNACH-Luis Antonio Álvarez Oval
Página 6
CONSTRAINT concepto_pkey PRIMARY KEY (idconcepto)
);

CREATE TABLE recibo (


folio integer NOT NULL,
matricula integer,
fecharec varchar,
totalrec double precision CONSTRAINT totalrec_invalido CHECK ( totalrec > 0 ),
CONSTRAINT recibo_pkey PRIMARY KEY (folio),
CONSTRAINT recibo_matricula_fkey FOREIGN KEY (matricula)
REFERENCES alumnos (matricula) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
);

CREATE TABLE detallerecibo (


cns integer NOT NULL,
idconcepto integer,
folio integer NOT NULL,
subtotal double precision CONSTRAINT subtotal_invalido CHECK ( subtotal > 0 ),
CONSTRAINT detallerecibo_pkey PRIMARY KEY (folio, cns),
CONSTRAINT detallerecibo_folio_fkey FOREIGN KEY (folio)
REFERENCES recibo (folio) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT detallerecibo_idconcepto_fkey FOREIGN KEY (idconcepto)
REFERENCES concepto (idconcepto) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE CASCADE
);

CREATE TABLE calendarioescolar (


fecha varchar NOT NULL,
motivo varchar NOT NULL,
CONSTRAINT calendarioescolar_pkey PRIMARY KEY (fecha)
);

Inserción de datos para algunas tablas recién construidas.


insert into CuentaCheques values(1,700,'HSBC');
insert into CuentaCheques values(2,9000,'HSBC');
insert into CuentaCheques values(3,60,'HSBC');
insert into CuentaCheques values(4,10,'HSBC');
insert into CuentaCheques values(5,1000,'HSBC');
insert into CuentaCheques values(6,200,'HSBC');
insert into Cheque values(1,10,200,'2008-02-01');
insert into Cheque values(2,10,575.20,'2008-02-01');
insert into Cheque values(2,20,20,'2008-02-01');

Administración de Base de Datos - Laboratorio 2


UNACH-Luis Antonio Álvarez Oval
Página 7
insert into Cheque values(3,10,600,'2007-02-01');
insert into Cheque values(4,10,800,'2007-02-01');
insert into Cheque values(5,10,100,'2007-02-01');
insert into Cheque values(6,10,300,'2007-02-01');

insert into Tabulador values(10,100);


insert into Tabulador values(20,200);
insert into Tabulador values(30,300);
insert into Tabulador values(40,400);
insert into Tabulador values(50,500);
insert into Tabulador values(60,600);
insert into Tabulador values(70,700);

insert into Profesores values(1,40,'Roberto','Maestria',15000);


insert into Profesores values(2,70,'Carlos','Doctorado',25000);
insert into Profesores values(3,20,'Luis','Licenciatura',6000);
insert into Profesores values(4,30,'Yunuan','Maestria',12000);
insert into Profesores values(5,10,'Julio','Licenciatura',4500);
insert into Profesores values(6,20,'Samuel','Licenciatura',5500);

insert into CursosEspeciales values(1,1,1,20070204,20050204);


insert into CursosEspeciales values(2,2,2,20070204,20050204);
insert into CursosEspeciales values(3,3,3,20070204,20050204);
insert into CursosEspeciales values(4,4,4,20070204,20050204);
insert into CursosEspeciales values(5,5,5,20070204,20050204);

insert into CursosExtracurricular values(1,'admin',204);


insert into CursosExtracurricular values(2,'diseño',204);
insert into CursosExtracurricular values(3,'bdd',204);
insert into CursosExtracurricular values(4,'java',204);

insert into Materias values(1,'admin bdd',204);


insert into Materias values(2,'redes',204);
insert into Materias values(3,'redes 2',204);
insert into Materias values(4,'admin bdd',204);

Los datos insertados solo sirven para demostrar el funcionamiento de los privilegios de acceso,
queda del usuario insertar datos en el resto de las tablas para demostrar que las reglas de acceso son
funcionales para cada usuario.

Borrado de las tablas.


En caso de necesitar borrar las tablas este es el orden en que deben ser borradas, ya que la
aplicación estricta de la integridad referencial genera problemas.
drop table CalendarioEscolar;
drop table DetalleRecibo;
drop table Recibo;

Administración de Base de Datos - Laboratorio 2


UNACH-Luis Antonio Álvarez Oval
Página 8
drop table Concepto;
drop table Faltas;
drop table Bimestre;
drop table Alumnos;
drop table CEExtracurricula;
drop table CEVerano;
drop table Materias;
drop table CursosExtracurricular;
drop table CursosEspeciales;
drop table Profesores;
drop table Tabulador;
drop table Cheque;
drop table CuentaCheques;

Verificando las tablas con restricciones.


● Intente insertar el siguiente registro en la tabla cheques
insert into Cheque values(6,10,0,'2007-02-01');
¿Se le permitió ejecutar la operación? Explique ampliamente.
● Intente insertar el siguiente registro en la tabla cheques
insert into Cheque values(6,10,10,'2007-02-01');
¿Se le permitió ejecutar la operación? Explique ampliamente.
● Elimine la cuenta de cheques no. 6
Delete from CuentaCheques where ncuenta = 6;
¿Funcionó? Ahora verifique que paso con el cheque 10 que inserto en el paso anterior. Explique
ampliamente.
● Inserte el siguiente registro en la tabla Concepto:
Insert into concepto values(1);
¿Funcionó? Explique ampliamente.
● Intente insertar el siguiente registro en la tabla cheques
insert into Cheque values(6,10,10, <fecha posterior al dia en que se ejecuta>);
Ejemplo si hoy es 19 de Febrero del 2008 use como fecha posterior el 21 de Febrero.
¿Funcionó? Explique ampliamente.

Trabajo adicional.
● Verifique que todas las resticciones que se le han puesto a la BD funcionen adecuadamente.
● Usando el esquema que a continuación se le indica, valide lo siguiente:
El precio de venta del articulo siempre debe ser mayor en un 10% al precio de venta.
El precio de venta debe ser mayor a cero.
El precio de compra debe ser mayor a cero.
Articulo ( CodBarras, PrecioVenta, PrecioCompra, Descripción )
Demuestre que su código funciona adecuadamente, con datos y respuestas a las restricciones.
● Valida que el campo nombre de la tabla Profesores solo acepte nombres en minúsculas y con un
rango desde la “a” hasta la “z”. Pista: Construya una Expresión Regular (vea el manual de
PostgreSQL) que haga la validación.
● Encuentre el error de la tabla CursosEspeciales y corrijalo. Explique ampliamente.
● Explique la condición en la que el borrado en cascada es útil y cuándo no lo es.

Administración de Base de Datos - Laboratorio 2


UNACH-Luis Antonio Álvarez Oval
Página 9
Referencias.
 Dar, Usama. PostgreSQL Server Programming. (2015) Packt Publishing. ISBN: 1783980583.
 Riggs, Simon; et al. PostgreSQL 11 Administration Cookbook. (2019). Packt Publishing. ISBN:
1789537584.
 Douglas, Korry; Douglas, Susan. PostgreSQL. (2003) Sams Publishing. ISBN: 0-7357-1257-3.

Administración de Base de Datos - Laboratorio 2


UNACH-Luis Antonio Álvarez Oval
Página 10

También podría gustarte