Sie sind auf Seite 1von 5

Nombre: Álvaro Morcillo Barbero Tarea: 2.1 Fecha: 16/12/2017 N.

º Página: 1

Apartado 1

• Escribe las cuatro sentencias SQL necesarias para crear las cuatro
tablas, cumpliendo todas las restricciones del grafo relacional y en el
orden adecuado para que no haya problemas de integridad referencial

CREATE TABLE “DIRECTOR" (


"NIF" VARCHAR2(9) PRIMARY KEY,
"NOMBRE" VARCHAR2(20) NOT NULL)

CREATE TABLE "EMPRESA"


( "CIF" VARCHAR2(9),
"Nombre" VARCHAR2(25) NOT NULL,
"Direccion" VARCHAR2(25) NOT NULL,
"Telefono" NUMBER(9),
CONSTRAINT "EMPR_PK" PRIMARY KEY ("CIF"),
CONSTRAINT "NOMBRE_UK" UNIQUE ("Nombre")
)

CREATE TABLE "PROYECTO" (


"Nombre" VARCHAR2(25) PRIMARY KEY,
"Descripción" VARCHAR2 (1000),
"DIRE" VARCHAR (9) UNIQUE,
"Duración" NUMBER(3),
CONSTRAINT dire_fk FOREIGN KEY ("DIRE")
REFERENCES "DIRECTOR"("NIF"),
CONSTRAINT proy_nn NOT NULL(“Descripción”, “DIRE”, “Duración”)

CREATE TABLE "PATROCINA"


( "PROY" VARCHAR2(25),
"EMPR" VARCHAR2(9),
"FECHA_INICIO" DATE,
"FECHA_FIN" DATE,
CONSTRAINT "PATR_FECH_CK" CHECK (FECHA_FIN>FECHA_INICIO),
CONSTRAINT "PATR_PK" PRIMARY KEY ("PROY", "EMPR", "FECHA_INICIO"),
CONSTRAINT "PATR_PROY_FK" FOREIGN KEY ("PROY")
REFERENCES "PROYECTO" ("Nombre") ON DELETE CASCADE,
CONSTRAINT "patr_empr_fk" FOREIGN KEY ("EMPR")
REFERENCES "EMPRESA" ("CIF")
)
Nombre: Álvaro Morcillo Barbero Tarea: 2.1 Fecha: 16/12/2017 N.º Página: 2

Apartado 2

1. Añade un atributo obligatorio EDAD a DIRECTOR. Explica qué ocurrirá


si la tabla DIRECTOR ya tiene datos y cómo lo solucionarías

ALTER TABLE "DIRECTOR" ADD "Edad" NUMBER (2) NOT NULL

Al añadir un atributo obligatorio a la tabla DIRECTOR, se crea otra columna


para el atributo EDAD, pero esta se agrega automáticamente al final de la
tabla.

El problema es que, en SQL, como en muchos otros motores de bases de


datos, no se maneja el "posicionamiento" de las columnas, por tanto, para
“ordenar" las columnas, hay que crear una nueva tabla con las columnas en el
orden que queramos y pasar los datos de la tabla anterior a la nueva. Para
hacer eso, ejecutamos los comandos DROP (a la tabla anterior) y RENAME
(a la nueva tabla creada).

2. La duración de cada proyecto (nº de meses) tiene que ser de 3 a 18


meses.

ALTER TABLE "PROYECTO" ADD CONSTRAINT proy_dur_ck CHECK ("Duración"


BETWEEN 3 AND 18)

3. Elimina la restricción de las fechas de PATROCINA

ALTER TABLE "PATROCINA" DROP CONSTRAINT PATR_FECH_CK

4. Elimina el atributo NUSS de DIRECTOR.

No existe ningún atributo NUSS en la tabla DIRECTOR. Aun así, el código


sería:

ALTER TABLE “DIRECTOR” DROP COLUMN (“NUSS”)

5. Cambia el nombre al atributo NIF de DIRECTOR por CODIGO. Explica si


hay algún problema al realizar este cambio

ALTER TABLE “DIRECTOR” RENAME COLUMN “NIF” TO “CODIGO”

Hay un problema, pues al cambiar el nombre de una columna, no se cambian


automáticamente las referencias a esa columna. Es necesario modificar de
forma manual los objetos que hacen referencia a la columna cuyo nombre se
ha cambiado.
Nombre: Álvaro Morcillo Barbero Tarea: 2.1 Fecha: 16/12/2017 N.º Página: 3

Por tanto, modificaremos la tabla PROYECTO, porque tiene una clave ajena
referenciada a la tabla de DIRECTOR

Primero borramos la restricción que hace referencia a la clave de


PROYECTO:

ALTER TABLE “PROYECTO” DROP CONSTRAINT DIRE_FK

Ahora la volvemos a crear haciendo referencia a la columna “CODIGO”

ALTER TABLE "PROYECTO" ADD CONSTRAINT "proy_dire_fk" FOREING KEY


("DIRE") REFERENCES "DIRECTOR" ("CODIGO")

6. Añade otra restricción a PROYECTO para que la duración no sea mayor a


24 meses. ¿Qué valores podremos introducir ahora en este atributo?

Creo que primero hay que borrar o desactivar la restricción “proy_dur_ck” que
no permite que haya valores que no estén entre el 3 y el 18, pues no tiene
sentido crear otra restricción para que la duración no sea mayor de 24 meses
porque la otra restricción CHECK ("Duración" BETWEEN 3 AND 18) impide que
haya valores desde el 18 al 24.

El código de la restricción sería:

ALTER TABLE "PROYECTO" ADD CONSTRAINT proy_dur2_ck CHECK ("Duración"


BETWEEN 3 AND 24)

Podemos introducir valores que vayan desde el número 3 al 24.

7. Cambia la clave primaria de EMPRESA, ahora va a ser su NOMBRE.


Explica cómo habría que hacer este cambio si las tablas ya tuvieran
datos.

Primero hay que eliminar las restricciones que hacen referencia a DNI:

ALTER TABLE "PATROCINA" DROP CONSTRAINT "patr_empr_fk"

Ahora le quitamos a DNI la restricción de clave primaria:

ALTER TABLE "EMPRESA" DROP CONSTRAINT "EMPR_PK"

También le ponemos las restricciones de NOT NULL y UNIQUE a DNI, pues las ha
perdido al quitarle la restricción de clave primaria:

ALTER TABLE “EMPRESA” ADD CONSTRAINT “dni_nn” NOT NULL (“DNI”)

ALTER TABLE “EMPRESA” ADD CONSTRAINT “dni_uk” UNIQUE (“DNI”)


Nombre: Álvaro Morcillo Barbero Tarea: 2.1 Fecha: 16/12/2017 N.º Página: 4

Antes de asignar a “Nombre” como clave primaria, hay que borrar la restricción de
UNIQUE que tiene:

ALTER TABLE “EMPRESA” DROP CONSTRAINT “NOMBRE_UK”

Ahora si podemos establecer “Nombre” como clave primaria de EMPRESA

ALTER TABLE “EMPRESA” ADD CONSTRAINT “EMPR_PK” PRIMARY KEY


(“Nombre”)

Y por último, volvemos a crear la restricción que hace referencia a la clave primaria
de EMPRESA, en este caso a la clave de “Nombre”

ALTER TABLE "PATROCINA" ADD CONSTRAINT "patr_empr_fk" FOREING KEY


("EMPR") REFERENCES "EMPRESA" ("Nombre")

8. Cambia el nombre a la tabla PATROCINA. ¿Afecta este cambio a otras


tablas?

Le voy a cambiar el nombre a “PATROCINA_A”

ALTER TABLE "PATROCINA" RENAME TO "PATROCINA_A"

Este cambio afecta al resto de tablas que hagan referencia a esta, pues
cambiar el nombre de una tabla no cambia automáticamente las referencias a
esa tabla.

Pero como no hay ninguna tabla que haga referencia a PATROCINA, no


afecta el cambio en este caso.

9. Crea un usuario con tu nombre con todos los privilegios sobre las tablas.
Después quítale el permiso para borrar estas tablas.

Primero creo un usuario:

CREATE USER Alvaro IDENTIFIED BY contraseñadealvaro

Después le doy todos los privilegios:

GRANT ALL PRIVILEGES TO {Alvaro} [IDENTIFIED BY contraseñadealvaro] [WITH


ADMIN OPTION]

Ahora le quito el permiso para borrar las tablas:

REVOKE DELETE, CONTROL FROM Alvaro


Nombre: Álvaro Morcillo Barbero Tarea: 2.1 Fecha: 16/12/2017 N.º Página: 5

10. Explica qué significa el B:C (borrado en cascada para mantener la


integridad referencial) en la clave ajena PROY

Significa que si se intenta eliminar columna con una clave a la que hacen referencia
claves externas de columnas existentes en otras tablas (en este caso, “Nombre”
en la tabla “PROYECTO), todas las columnas que contienen dichas claves externas
también se eliminan (en este caso la clave ajena “PROY” en la tabla
“PATROCINA” también se elimina).

De este modo, no se pierde la integridad referencial. Si no utilizásemos B:C, al


borrar la columna “Nombre” en la tabla PROYECTO ocurriría un error, ya que
habría claves secundarias refiriéndose a una clave principal que ya no existe.

Das könnte Ihnen auch gefallen