2.6.1.- Concepto de vista. 2.6.2.- Aplicaciones de las vistas. • Una vista es una tabla derivada de otras tablas (básicas o virtuales). • Una vista se caracteriza porque: – Se considera que forma parte del esquema externo. – Una vista es una tabla virtual (no tiene una correspondencia a • Para la especificación de tablas con información que se accede con frecuencia pero no posee existencia física: – Información derivada de la relación entre varias tablas. – Información derivada de la formación de grupos de tuplas (p.e. para la obtención de estadísticas). – En general: información derivada de consultas complejas a la que se accede con frecuencia. nivel físico) – Se puede consultar como cualquier tabla básica. – Las actualizaciones se transfieren a la/s tabla/s original/es (con ciertas limitaciones). • Como mecanismo de seguridad: creación de vistas con, únicamente, los atributos de las tablas a los cuales se desea permitir acceder a determinados usuarios. • Para la creación de esquemas externos. 1 2 2.6.3.- Vistas en SQL. 2.6.3.- Vistas en SQL. • La sintaxis para la creación de vistas en SQL es la siguiente: • La sintaxis para la creación de vistas en SQL es la siguiente: CREATE | REPLACE VIEW vista [(comalista_columna)] CREATE | REPLACE VIEW vista [(comalista_columna)] AS expresión_tabla [with check option] AS expresión_tabla [with check option] en donde: en donde: – CREATE VIEW es la orden que permite la creación de la vista. – expresión_tabla es una consulta SQL cuyo resultado será el contenido de la vista. – vista es el nombre de la tabla virtual que se va a crear. – WITH CHECK OPTION es opcional y se debe incluir si se desea actualizar la – (comalista_columna) son los nombres de los atributos de la tabla y es opcional: vista de una manera íntegra. – Para la eliminación de una vista se utiliza la instrucción: • Si no se especifica, el nombre coincide con el nombre de los atributos resultantes en expresión_tabla. – DROP VIEW vista [restrict | cascade]; • Es obligatorio si algún atributo de expresión_tabla es el resultado de una función de agregación o una operación aritmética. 3 4 2.6.3.- Vistas en SQL (Ejemplos). 2.6.3.- Vistas en SQL (Vistas Actualizables). • Dada la siguiente relación de una base de datos: Motivos por los que una vista NO es actualizable: Cocinero(nombre:varchar, edad: number, país:varchar) • contiene operadores conjuntistas (UNION, INTERSECT,…). • el operador DISTINCT • funciones agregadas (SUM, AVG, ..) • la cláusula GROUP BY Obtén una vista con, únicamente, los cocineros franceses: El Check Option impide que yo pueda añadir cocineros que no sean franceses Obtén una vista con la edad media de los cocineros agrupados por país: 5 2.6.3.- Vistas en SQL (Vistas Actualizables). 2.6.3.- Vistas en SQL (Vistas Actualizables). Vista sobre una concatenación de relaciones: 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. • 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 siempre que no se viole ninguna restricción de integridad definida sobre dicha relación. 2.6.3.- Vistas en SQL (Vistas Actualizables). 2.7.1.- Concepto de disparador. EJEMPLO: • Dadas las siguientes relaciones: Persona(nif: dom_nif, nombre: dom_nom, edad: dom_edad) CP:{nif} Son reglas que especifican acciones que son activadas automáticamente por determinados eventos. Vivienda(cod_viv: dom_cod, nif: dom_nif, dir: dom_dir, num_hab: dom_num) CP:{cod_viv} CAj:{nif} Æ Persona • Dada la siguiente vista definida sobre dichas relaciones: CREATE VIEW Todo_Vivienda AS SELECT * FROM Persona NATURAL JOIN Vivienda ¿Podré modificar la dirección de una vivienda en Todo_Vivienda? ¿Podré modificar el nombre del propietario de una vivienda? 9 2.7.2.- Reglas Evento-Condición-Acción. 10 2.7.3.- Aplicaciones de los disparadores. Forma de una regla de actividad: Define el comportamiento activo del sistema. Aplicaciones: 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: • evento: operación de actualización • condición: expresión lógica del SQL. Sólo se ejecutará la acción si esta condición existe y es verdadera. • acción: procedimiento escrito en un lenguaje de programación que incluye instrucciones de manipulación de la BD. 11 • comprobación de restricciones de integridad • restauración de la consistencia • definición de reglas de funcionamiento de la organización • mantenimiento de información derivada 12 2.7.4.- Disparadores en SQL. 2.7.4.- Disparadores en SQL. 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 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] disyunción_eventos ::= OR evento [disyunción_eventos] evento ::= INSERT | DELETE | UPDATE [OF comalista_nombre_atributo] 13 2.7.4.- Disparadores en SQL. 14 2.7.4.- Disparadores en SQL. EVENTOS FOR EACH STATEMENT 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 BEFORE – nombre de parámetros: • evento INSERT: NEW • evento DELETE: OLD • evento UPDATE: OLD y NEW AFTER La regla se ejecuta una vez antes de la ejecución de la operación de actualización La regla se ejecuta una vez después de la ejecución de la operación de actualización FOR EACH ROW La regla se ejecuta una vez antes de actualización de cada tupla afectada por 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 – se pueden usar en la condición de la regla – se pueden usar en el bloque PL/SQL 15 16 2.7.4.- Disparadores en SQL. 2.7.4.- Disparadores en SQL. ACCIONES CONDICIONES bloque PL/SQL WHEN (condición) – expresión lógica de sintaxis similar a la condición de la cláusula WHERE de la instrucción SELECT – bloque escrito en el lenguaje de programación de Oracle PL/SQL – sentencias de manipulación de la BD: INSERT, DELETE, UPDATE, SELECT ... INTO ... – no puede contener subconsultas ni funciones agregadas – sentencias de programa: asignación, selección, iteración – sólo se puede hacer referencia a los parámetros del evento – sentencias de manejo de errores – sentencias de entrada/salida 17 2.7.4.- Disparadores en SQL. 18 2.7.4.- Disparadores en SQL (Ejemplo). La restricción R2 : Lenguaje de reglas: R2) Px: Pieza, Sx: Suministro ∀Px : Pieza (∃Sx : Suministro ( Sx.código=Px.código ) ) – 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] se define mediante una restricción general: create assertion R2 check not exists(select * from Pieza P where not exists(select * from Suministro S where P.código=S.código)); ¿Cómo controlar la restricción mediante reglas de actividad? 19 20 2.7.4.- Disparadores en SQL (Ejemplo). 2.7.4.- Disparadores en SQL (Ejemplo). Detectar qué eventos pueden afectar a la R.I.: TABLA, Suministro, Suministro, Pieza, OPERACIÓN, Borrado, Modificación, Inserción, ATRIBUTO código - Construir Triggers para controlar estos eventos. 21 CREATE TRIGGER T2 AFTER INSERT ON Pieza FOR EACH ROW DECLARE N: NUMBER; BEGIN SELECT COUNT(*) INTO N FROM Suministro S WHERE :new.codigo = S.codigo; IF N=0 THEN RAISE_APPLICATION_ERROR(-20000, ‘No se puede insertar una pieza, porque la pieza no tiene suministros. Cree las dos tuplas (la de pieza y la de suministro) dentro de una transacción deshabilitando este trigger.’); END IF; END; 22 2.8.- Limitaciones del modelo relacional. 2.8.- Limitaciones del modelo relacional. • Los modelos de datos tradicionales (relacional, jerárquico y red) han tenido éxito en aplicaciones tradicionales de negocios. • Requisitos y características de las nuevas aplicaciones: ¾ estructuras más complejas para los objetos, ¾ transacciones de mayor duración, ¾ nuevos tipos de datos para almacenar imágenes o elementos de texto grandes y ¾ la necesidad de definir operaciones no estándar específicas para las aplicaciones. • Los modelos tradicionales presentan deficiencias en aplicaciones: ¾ de diseño y fabricación en ingeniería (CAD/CAM/CIM), ¾ experimentos científicos, ¾ telecomunicaciones, ¾ sistemas de información geográfica, y ¾ multimedia. • Evolución de las bases de datos relacionales: ¾ bases de datos deductivas, ¾ bases de datos activas, ¾ bases de datos orientadas a objetos y ¾ bases de datos objeto-relacionales (SQL3) 23 24