Práctica 3: Lenguaje SQL 2ª Parte: Definición de datos Objetivos • Presentar la sintaxis de creación de tablas • Diferencia con SQL/92 • Presentar la sintaxis de la modificación de definición de una tabla • Presentar la sintaxis de la creación de una vista • Presentar la sintaxis para otorgar autorizaciones • Presentar la sintaxis para la creación de reglas de actividad (disparadores) • Todo ello para el sistema Oracle9 27/04/2006 Bases de Datos 2 1 Creación de una tabla definición_relación_básica ::= CREATE TABLE nom_relación (comalista_elemento_relación_básica) elemento_relación_básica ::= definición_atributo | restricción_relación definición_atributo ::= nom_atributo tipo_datos [DEFAULT (expresión)] [lista_restricción_atributo] tipo_datos::= CHAR (longitud) | VARCHAR (longitud) | NUMBER [(precisión[, escala])] | DATE 27/04/2006 Bases de Datos 3 Creación de una tabla restricción_atributo ::= [CONSTRAINT nombre_restricción] {[NOT] NULL| UNIQUE| PRIMARY KEY| REFERENCES nom_relación* [(nom_atributo*)] [ON DELETE CASCADE] | CHECK (condición) } [cuando_comprobar] 27/04/2006 Bases de Datos 4 2 Creación de una tabla restricción_relación ::= [CONSTRAINT nombre_restricción] { UNIQUE (comalista_nom_atributo) | PRIMARY KEY (comalista_nom_atributo) | FOREIGN KEY (comalista_nom_atributo) REFERENCES nom_relación* [(comalista_nom_atributo*)] [ON DELETE CASCADE] | CHECK (condición)} [cuando_comprobar] cuando_comprobar:= [NOT] DEFERRABLE [INITIALLY {INMEDIATE | DEFERRED}] 27/04/2006 Bases de Datos 5 Creación de una tabla Tipos de datos: • Numéricos: – NUMBER [(precisión[, escala])] – NUMBER (precisión): entero – NUMBER (precisión, escala): real • Alfanuméricos: – CHAR (longitud) – VARCHAR (longitud) o VARCHAR2 (longitud) • Fechas: – DATE 27/04/2006 Bases de Datos 6 3 Creación de una tabla • DEFAULT: La expresión de la cláusula DEFAULT se construye a partir de constantes de los tipos de datos predefinidos, operadores y funciones del sistema siguiendo la sintaxis adecuada en cada • Integridad referencial: débil y borrado en cascada • CHECK: – expresión lógica – sólo pueden aparecer columnas de la tabla donde se define – no puede incluir subconsultas – la tabla satisface la condición si se evalúa a cierto o indefinido para toda fila de la misma 27/04/2006 Bases de Datos 7 Creación de una tabla • DEFERRABLE: – permite que indicarle al sistema si la restricción se comprueba al final de la transacción o después de cada instrucción de actualización – SET CONSTRAINT {DEFERRED | INMEDIATE} 27/04/2006 Bases de Datos 8 4 Creación de una tabla. Ejemplo CREATE TABLE ciclista ( dorsal NUMBER(3) PRIMARY KEY, nombre VARCHAR2(30) NOT NULL, edad NUMBER(2) , nomeq VARCHAR(25) NOT NULL REFERENCES equipo (nomeq)); CREATE TABLE etapa ( netapa NUMBER(2) PRIMARY KEY, km NUMBER(3) , salida VARCHAR(35), llegada VARCHAR(35), dorsal NUMBER(3) REFERENCES ciclista (dorsal)); 27/04/2006 Bases de Datos 9 Diferencia con el SQL/92 restricción_relación ::= [CONSTRAINT nombre_restricción] { UNIQUE (comalista_nom_atributo) | PRIMARY KEY (comalista_nom_atributo) | FOREIGN KEY (comalista_nom_atributo) REFERENCES nom_relación* [(comalista_nom_atributo*)] [tipo_integridad_referencial] [directriz_borrado] [directriz_modificación] | CHECK (condición)} [cuando_comprobar] 27/04/2006 Bases de Datos 10 5 Diferencia con el SQL/92 restricción_atributo ::= [CONSTRAINT nombre_restricción] {[NOT] NULL| UNIQUE| PRIMARY KEY| REFERENCES nom_relación* [(nom_atributo*)] [directriz_borrado] [directriz_modificación] | CHECK (condición) } [cuando_comprobar] 27/04/2006 Bases de Datos 11 Diferencia con el SQL/92 tipo_integridad_referencial ::= MATCH { FULL | PARTIAL} directriz_borrado ::= ON DELETE { CASCADE | SET NULL | SET DEFAULT | NO ACTION} directriz_actualización ::= ON UPDATE { CASCADE | SET NULL | SET DEFAULT | NO ACTION} 27/04/2006 Bases de Datos 12 6 Modificación de la definición de una tabla modificación_relación::= ALTER TABLE nombre_relación {ADD (comalista_elemento_relación_básica) /*Añadir nuevos atributos o restricciones*/ | MODIFY (comalista_definición_atributo) /*Modificar la definición de atributos*/ | {DROP /*Borrar una restricción*/ | [VALIDATE | NOVALIDATE] ENABLE | DISABLE } (restricción) } /*Activar (desactivar) una restrición de integridad*/ restricción::= {PRIMARY [CASCADE] | UNIQUE (comalista_nombre_atributo) [CASCADE] | CONSTRAINT nombre_restricción } 27/04/2006 Bases de Datos 13 Eliminación de una tabla eliminación_relación::= DROP TABLE nombre_relación [CASCADE CONSTRAINTS] 27/04/2006 Bases de Datos 14 7 Definición de vistas definición_vista::= CREATE [OR REPLACE] VIEW nombre_vista [(comalista_nombre_atributo)] AS sentencia_SELECT [WITH CHECK OPTION] eliminación_vista::= DROP VIEW nombre_vista 27/04/2006 Bases de Datos 15 Definición de vistas. Ejemplo CREATE VIEW etapas_con_puertos (netapa, salida, llegada) AS SELECT distinct netapa, salida, llegada FROM Etapa E, Puerto P WHERE E.netapa=P.netapa 27/04/2006 Bases de Datos 16 8 Definición de vistas: vistas actualizables Motivos por los que una vista no es actualizable: • contiene operadores conjuntistas (UNION, INTERSECT,… • el operador DISTINCT • funciones agregadas (SUM, AVG, ..) • la cláusula GROUP BY 27/04/2006 Bases de Datos 17 Definición de vistas: vistas actualizables Vista sobre una tabla básica: • el sistema traducirá la actualización sobre la vista en una operación de actualización sobre la relación básica • siempre que no se viole ninguna restricción de integridad definida sobre dicha relación 27/04/2006 Bases de Datos 18 9 Definición de vistas: vistas actualizables Vista sobre una concatenación de relaciones: • la actualización sólo puede modificar UNA de las tablas básicas • actualización modificará la relación básica que cumpla la propiedad de conservación de la clave (aquella relación tal que su clave primaria podría ser también clave de la vista) • la actualización no se realizará si viola alguna de las restricciones definidas sobre la relación básica que se va a actualizar 27/04/2006 Bases de Datos 19 Definición de privilegios definición_operación_grant::= GRANT comalista_privilegios_objeto ON usuario.objeto TO {PUBLIC | comalista_usuario} /*PUBLIC : trasmite los privilegios a todos los usuarios*/ [WITH ADMIN OPTION] /*permiso para ceder privilegios a terceros*/ privilegio_objeto::= { ALTER | EXECUTE | INDEX | INSERT | READ | REFERENCES | SELECT | UPDATE | DELETE} definición_operación_revoke::= REVOKE {comalista_privilegios_objeto | ALL PRIVILEGES} ON usuario.objeto FROM {PUBLIC | comalista_usuario} [WITH ADMIN OPTION] 27/04/2006 Bases de Datos 20 10 Definición de privilegios Ejemplo 1: Dar permisos de inserción y borrado en ciclista a todo el mundo: GRANT INSERT, DELETE ON ciclista TO PUBLIC Ejemplo 2: Dar permisos de consulta en etapa al usuario “pepe”, dándole permiso de que a su vez pueda conceder permisos a otros usuarios: GRANT SELECT ON etapa TO pepe WITH ADMIN OPTION 27/04/2006 Bases de Datos 21 Definición de reglas de actividad: disparadores Define el comportamiento activo del sistema. Aplicaciones: • comprobación de restricciones de integridad • control de la seguridad • definición de reglas de funcionamiento de la organización • mantenimiento de información derivada 27/04/2006 Bases de Datos 22 11 Definición de reglas de actividad: disparadores Forma de una regla de actividad: Evento - Condición - Acción acción que el sistema ejecuta cuando como respuesta a la ocurrencia de un evento cuando cierta condición se satisface. En Oracle: • evento: operación de actualización • condición: expresión lógica del SQL • acción: procedimiento escrito en PL/SQL (incluye instrucción de manipulación de la BD) 27/04/2006 Bases de Datos 23 Definición de reglas de actividad definición_regla::= {CREATE | REPLACE} TRIGGER nombre_regla {BEFORE | AFTER | INSTEAD OF} evento [disyunción_eventos] ON {nombre_relación | nombre_vista} [ [REFERENCING OLD AS nombre_referencia [NEW AS nombre_referencia] ] [FOR EACH {ROW | STATEMENT} [WHEN ( condición ) ] ] bloque PL/SQL disyunción_eventos ::= OR evento [disyunción_eventos] evento ::= INSERT | DELETE | UPDATE [OF comalista_nombre_atributo] 27/04/2006 Bases de Datos 24 12 Definición de reglas de actividad FOR EACH STATEMENT FOR EACH ROW BEFORE La regla se ejecuta una vez antes de la ejecución de la operación de actualización La regla se ejecuta una vez antes de actualización de cada tupla afectada por la operación de actualización AFTER La regla se ejecuta una vez después de la ejecución de la operación de actualización La regla se ejecuta una vez después de actualización de cada tupla afectada por la operación de actualización 27/04/2006 Bases de Datos 25 Definición de reglas de actividad EVENTOS {BEFORE | AFTER | INSTEAD OF} evento [disyunción_eventos] ON {nombre_relación | nombre_vista} disyunción_eventos ::= OR evento [disyunción_eventos] evento ::= INSERT | DELETE | UPDATE [OF comalista_nombre_atributo] 27/04/2006 Bases de Datos 26 13 Definición de reglas de actividad EVENTOS Parametrización de eventos: – los eventos de las reglas FOR EACH ROW están parametrizados – pametrización implícita: • evento INSERT o DELETE: n (n grado de la relación) • evento UPDATE: 2*n – nombre de parámetros: • evento INSERT: NEW • evento DELETE: OLD • evento UPDATE: OLD y NEW – se pueden usar en la condición de la regla – se pueden usar en el bloque PL/SQL 27/04/2006 Bases de Datos 27 Definición de reglas de actividad CONDICIONES WHEN (condición) – expresión lógica de sintaxis similar a la condición de la cláusula WHERE de la instrucción SELECT – no puede contener subconsultas ni funciones agregadas – sólo se puede hacer referencia a los parámetros del evento 27/04/2006 Bases de Datos 28 14 Definición de reglas de actividad ACCIONES bloque PL/SQL – bloque escrito en el lenguaje de programación de Oracke PL/SQL – sentencias de manipulación de la BD: INSERT, DELETE, UPDATE, SELECT ... INTO ... – sentencias de programa: asignación, selección, iteración – sentencias de manejo de errores – sentencias de entrada/salida 27/04/2006 Bases de Datos 29 Definición de reglas de actividad Lenguaje de reglas: – Creación: CREATE TRIGGER nombre_regla ... – Eliminación: DROP TRIGGER nombre_reglas – Modificación: REPLACE TRIGGER nombre_regla ... – Recompilación: ALTER TRIGGER nombre_regla COMPILE – Des/Habilitar regla: ALTER TRIGGER nombre_regla [ENABLE | DISABLE] – Des/Habilitar todas las reglas sobre una relación: ALTER TABLE nombre_relación [{ENABLE | DISABLE} ALL TRIGGERS] 27/04/2006 Bases de Datos 30 15 Definición de reglas de actividad a) La siguiente regla define en el esquema de la base de datos el siguiente comportamiento activo: “después de cada inserción en la relación R hacer una copia de la tupla insertada en la relación R_copia”. (El esquema de R es R(A:dom_A, B:dom_B) ) CREATE TRIGGER T1 AFTER INSERT ON R FOR EACH ROW BEGIN INSERT INTO R_copia VALUES(:NEW.A, :NEW.B); END; 27/04/2006 Bases de Datos 31 Definición de reglas de actividad b) La siguiente regla define en el esquema de la base de datos el siguiente comportamiento activo: “ después de cada operación de actualización de la relación R registrar la información sobre el usuario y la fecha de la actualización en la relación R_control” CREATE TRIGGER T2 AFTER INSERT OR UPDATE OR DELETE ON R FOR EACH STATMENT BEGIN INSERT INTO R_control VALUES(user, sysdate); END; (user y sysdate son funciones del sistema que devuelven respectivmente el usuario de la sesión y la fecha del sistema) 27/04/2006 Bases de Datos 32 16 Definición de reglas de actividad c) La siguiente regla define en el esquema la restricción: “No se puede insertar en la relación R una tupla si existe en la relación S” CREATE TRIGGER T3 AFTER INSERT ON R FOR EACH ROW DECLARE Aux NUMBER; BEGIN SELECT Count(*) INTO Aux FROM S WHERE :NEW.A=S.A; IF Aux>0 THEN RAISE_APPLICATION_ERROR(-20000, ‘No se puede realizar esta operación’); END IF; END; 27/04/2006 Bases de Datos 33 Ejercicios – (Práctica nº3, 2ª parte) Diseñar la base de datos de una pequeña biblioteca: – consultar los datos de un libro: código del libro, título, autor(es), temática y en caso de estar prestado, el socio que lo tiene actualmente en préstamo – consultar la información sobre un socio: código del socio, nombre, dirección, teléfono y libros que actualmente tiene en préstamo así como la fecha de préstamo – consultar los préstamos históricos de un socio: código del libro, fecha del préstamo y fecha de la devolución – dar de alta, dar de baja y modificar los datos de un socio – gestionar los préstamos: prestar un libro a un socio y registrar la devolución de un libro. (se supone que un préstamo dura al menos un día, es decir un libro no se puede prestar el mismo día más de una vez). 27/04/2006 Bases de Datos 34 17 Ejercicios – (Práctica nº3, 2ª parte) Diseñar la base de datos de una pequeña biblioteca: restricciones – el código del libro identifica unívocamente al libro – el código del socio identifica unívocamente al socio – el conjunto de temas utilizados para clasificar un libro son: física, electricidad, mecánica y óptica – la fecha de devolución de un libro debe ser posterior a la fecha de préstamo – el número total de libros que tiene prestados un socio es un dato derivado que será mantenido automáticamente por el sistema 27/04/2006 Bases de Datos 35 Ejercicios – (Práctica nº3, 2ª parte) Tareas: a) Definir el esquema relacional de la base datos anterior (usando los conceptos del modelo relacional b) Definir la base de datos en el sistema ORACLE9 c) Realizar actualizaciones y consultas sobre la base de datos creada 27/04/2006 Bases de Datos 36 18 Diferencia con el SQL/92 esquema ::= CREATE SQUEME [esquema] [AUTORIZATION usuario] lista_elemento_esquema elemento_esquema ::= { definición_dominio definición_relación_básica definición_vista definición_restricción definición_privilegio } 27/04/2006 | | | | Bases de Datos 37 Diferencia con el SQL/92: dominios definición_dominio ::= CREATE DOMAIN dominio [AS ] tipo_dato [DEFAULT {literal | función_sistema | NULL ] [definición_restricción_dominio] definición_restricción_dominio ::= [CONSTRAINT nombre ] CHECK (expresión_condicional) [cuando_comprobar] 27/04/2006 Bases de Datos 38 19 Diferencia con el SQL/92: relaciones restricción_relación ::= [CONSTRAINT nombre_restricción] { UNIQUE (comalista_nom_atributo) | PRIMARY KEY (comalista_nom_atributo) | FOREIGN KEY (comalista_nom_atributo) REFERENCES nom_relación* [(comalista_nom_atributo*)] [tipo_integridad_referencial] [directriz_borrado] [directriz_actualización] | CHECK (condición)} [cuando_comprobar] 27/04/2006 Bases de Datos 39 Diferencia con el SQL/92:relaciones restricción_atributo ::= [CONSTRAINT nombre_restricción] {[NOT] NULL| UNIQUE| PRIMARY KEY| REFERENCES nom_relación* [(nom_atributo*)] [directriz_borrado] [directriz_actualización] | CHECK (condición) } [cuando_comprobar] 27/04/2006 Bases de Datos 40 20 Diferencia con el SQL/92: relaciones tipo_integridad_referencial ::= MATCH { FULL | PARTIAL} directriz_borrado ::= ON DELETE { CASCADE | SET NULL | SET DEFAULT | NO ACTION} directriz_actualización ::= ON UPDATE { CASCADE | SET NULL | SET DEFAULT | NO ACTION} 27/04/2006 Bases de Datos 41 Diferencia con el SQL/92: restricciones definición_restricción ::= CREATE ASSERTION restricción CHECK (expresión_condicional) [cuando_comprobar] 27/04/2006 Bases de Datos 42 21