Ejercicio - 3 - Resuelto - RENTING EN COLOR

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

Ejercicio 3 (RENTING) - Unidad 2: Bases de Datos Relacionales.

Se recomienda crear un Workspace independiente para cada uno de los ejercicios.


(En la resolución de ejercicio 1 pasos detallados de cómo hacerlo)

Parte a: Creación de las tablas y restricciones sobre las mismas.


/* tabla CLIENTES */
DROP TABLE CLIENTES;
CREATE TABLE CLIENTES (
TIPO VARCHAR2(1) NOT NULL,
NUMERO NUMBER(4,0) NOT NULL,
NIF VARCHAR2(9) NOT NULL UNIQUE,
NOMBRE VARCHAR2(15) NOT NULL,
APELLIDOS1 VARCHAR2(15) NOT NULL,
APELLIDOS2 VARCHAR2(15),
EXTRANJERO VARCHAR2(1) DEFAULT 'N' NOT NULL ,
TELEFONO NUMBER(9,0) NOT NULL,
EMAIL VARCHAR2(60) ,
CONSTRAINT CLI_COD_PK PRIMARY KEY (TIPO,NUMERO),
CONSTRAINT CLI_TIP_CK CHECK ( TIPO IN ( 'A','B','C','D','E' ) ),
CONSTRAINT CLI_TEL_CK CHECK (substr(TELEFONO,1,1)=6 OR substr(TELEFONO,1,1)=9
),
CONSTRAINT CLI_EXT_CK CHECK ( EXTRANJERO IN ( 'S','N' ) )
);

/* tabla VEHICULOS */
DROP TABLE VEHICULOS;
CREATE TABLE VEHICULOS (
MATRICULA VARCHAR2(10) NOT NULL,
MARCA VARCHAR2(15) NOT NULL,
MODELO VARCHAR2(40) NOT NULL UNIQUE,
F_COMPRA DATE DEFAULT SYSDATE,
F_VENTA DATE,
CONSTRAINT VEH_MTR_PK PRIMARY KEY (MATRICULA),
CONSTRAINT VEH_MAR_CK CHECK ( MARCA = UPPER(MARCA) )
);

/* tabla ALQUILERES */
DROP TABLE ALQUILERES;
CREATE TABLE ALQUILERES (
MATRICULA VARCHAR2(10) NOT NULL,
TIPO VARCHAR2(1) NOT NULL,
NUMERO NUMBER(4,0) NOT NULL,
F_ALQUILER DATE DEFAULT SYSDATE NOT NULL ,
N_DIAS NUMBER(2,0) DEFAULT 0 ,
CONSTRAINT ALQ_CLV_PK PRIMARY KEY (MATRICULA, TIPO, NUMERO, F_ALQUILER),
CONSTRAINT ALQ_CCL_FK FOREIGN KEY (TIPO, NUMERO)
REFERENCES CLIENTES (TIPO, NUMERO)
ON DELETE CASCADE ,
CONSTRAINT ALQ_CMA_FK FOREIGN KEY (MATRICULA)
REFERENCES VEHICULOS (MATRICULA)
ON DELETE CASCADE );

Os indico una sentencia muy útil para ver las CONSTRAINTS (restricciones) de un 
conjunto de tablas: 

select table_name,constraint_type, constraint_name ,search_condition


from user_constraints
where table_name in ('CLIENTES','VEHICULOS','ALQUILERES')
order by table_name desc,constraint_type,constraint_name;
Ejercicio 3 (RENTING) - Unidad 2: Bases de Datos Relacionales.

Pruebas de inserción para comprobar el correcto funcionamiento de las tablas y sus


restricciones:

INSERT INTO CLIENTES VALUES ('A',0001, '33111222B','ANTONIA','GARCIA', 'LOPEZ','S',


123456789,'[email protected]');
Daría problema en el número de teléfono.

INSERT INTO CLIENTES VALUES ('A',0001, '33111222B','ANTONIA','GARCIA', 'LOPEZ','S',


923456789,'[email protected]');

INSERT INTO CLIENTES VALUES ('B',9001, '44111222L','PEDRO','SANCHEZ', NULL,'N',6091


11222,'[email protected]');

INSERT INTO VEHICULOS VALUES ('BA-1234-AC','MERCEDES','C280','01/02/1990',NULL);


INSERT INTO VEHICULOS VALUES ('CC-1234-AC','MERCEDES','C290',SYSDATE, NULL);

INSERT INTO ALQUILERES VALUES ('BA-1234-AC','A',0001,SYSDATE,1,0,10 );


INSERT INTO ALQUILERES VALUES ('BA-1234-AC','A',0001,'01/01/1990',1,0,10 );
INSERT INTO ALQUILERES VALUES ('CC-1234-AC','B',9001,'01/01/1992',1,0,10 );

Enlaces interesantes sobre uso de funciones:

Documentación función INSTR :


http://www.techonthenet.com/oracle/functions/instr.php

Documentación función UPPER :


http://www.techonthenet.com/oracle/functions/upper.php

Documentación CONSTRAINT xxxxx FOREIGN KEY xxxxx REFERENCES xxxx ON DELETE


CASCADE :
http://www.techonthenet.com/oracle/foreign_keys/foreign_delete.php

Documentación función TRUNC :


http://www.techonthenet.com/oracle/functions/trunc_nbr.php

Documentación función MONTHS_BETWEEN :


http://www.techonthenet.com/oracle/functions/months_between.php
Ejercicio 3 (RENTING) - Unidad 2: Bases de Datos Relacionales.

Parte b: Modificación sobre la estructura inicial:


1. Añadir un nuevo posible valor “P” al campo tipo de la tabla clientes. (Una vez modificado este
aspecto, por ejemplo el codigo P1234 sería también válido).
ALTER TABLE CLIENTES DROP CONSTRAINT CLI_TIP_CK;
ALTER TABLE CLIENTES ADD CONSTRAINT CLI_TIP_CK
CHECK ( TIPO IN ( 'A','B','C','D','E',’P’ ));

2. Añadir un nuevo campo “número de kilómetros” a la tabla alquileres teniendo en cuenta que solo
podrá contener valores enteros entre 10 y 1500 ambos incluidos.
ALTER TABLE ALQUILERES ADD N_KM NUMBER(4,0);
ALTER TABLE ALQUILERES ADD CONSTRAINT ALQ_NKM_CK
CHECK (N_KMS BETWEEN 10 AND 1500 );
(En una sola instrucción)
ALTER TABLE ALQUILERES ADD N_KM NUMBER(4,0) NOT NULL CONSTRAINTS
ALQ_NKM_CK CHECK (N_KMS BETWEEN 10 AND 1500 );

3. En la tabla vehículos, la fecha de venta no puede ser menor que la fecha de compra.
ALTER TABLE VEHICULOS ADD CONSTRAINT VEH_FCO_CK
CHECK ( F_COMPRA <= F_VENTA ) ;

4. Añadir una nueva clave en la tabla vehículos que esté formada por los campos marca y modelo.
ALTER TABLE VEHICULOS ADD CONSTRAINT VEH_MMO_KE UNIQUE (MARCA, MODELO ) ;

5. Cambia la clave primaria de la tabla CLIENTES por su NIF.


Primero debemos eliminar la restricción donde se establecía la clave primaria de la tabla:
ALTER TABLE CLIENTES DROP CONSTRAINT CLI_COD_PK CASCADE;
Ahora creamos una nueva:
ALTER TABLE CLIENTES ADD CONSTRAINT CLI_COD_PK PRIMARY KEY (NIF);

6. No podemos añadir un alquiler de un vehículo si el valor del “numero de días” es inferior a 2 o


superior a 15.
ALTER TABLE ALQUILERES ADD CONSTRAINT ALQ_NDI_CK
CHECK ( N_DIAS BETWEEN 2 AND 15 );

7. Elimina la restricción que controla los valores que puede tomar el atributo extranjero de la tabla
clientes.
ALTER TABLE CLIENTES DROP CONSTRAINT CLI_EXT_CK;

8. Elimina la columna correo electrónico de la tabla CLIENTES.


ALTER TABLE CLIENTES DROP COLUMN EMAIL;

9. Crea un usuario con tu nombre y clave BD2 y dale todos los privilegios sobre la tabla VEHICULOS.
CREATE USER NOMBREDELALUMNO IDENTIFIED BY BD2;
GRANT ALL ON VEHICULOS TO NOMBREDELALUMNO;
En este caso el camino más directo es entrar desde el "Run SQL Command Line" con el siguiente comando:
SQL> conn sys as sysdba; (posteriormente te pide la password).

10. Ahora al usuario anterior déjale solo permiso para leer los datos de la tabla VEHICULOS. (Sólo podría
seleccionar sus datos, nada más).
REVOKE ALL ON VEHICULOS TO NOMBREDEALUMNO;
GRANT SELECT ON VEHICULOS FROM NOMBRE DE ALUMNO;

O bien revocando todos los demás:


REVOKE EXECUTE, INDEX, REFERENCES, INSERT, ALTER, UPDATE, DELETE ON
VEHICULOS FROM NOMBREDELALUMNO;

También podría gustarte