Contenidos
Vistas
Las vistas se utilizan en situaciones en las que por motivos de seguridad o de rendimiento, queremos ocultar ciertos datos a los usuarios
En el ejemplo, un cliente necesita saber el número operación de un préstamo a su nombre, el ‘C-9732‘ y el nombre de la sucursal que lo ha tramitado, pero para esa operación no es necesario que vea el saldo o más datos relacionados
Con la consulta anterior resolvíamos lo que el cliente necesitaba, pero le dábamos más datos de los necesarios, pudiendo poner a la entidad bancaria en una situación que podría ser insegura
Las relaciones que no forman parte del modelo lógico pero son visibles a los usuarios mediante relaciones virtuales, se denominan vistas
Definición básica de vistas
CREATE VIEW
Las relaciones se definen mediante el comando CREATE VIEW:
\text{CREATE VIEW v} AS r
Donde r es una expresión de consulta y v es el nombre de la vista
En el ejemplo se ha creado una vista que trata de resolver el problema del ejemplo anterior
Sin embargo, a pesar de que hemos mejorado la seguridad al no mostrar al usuario los saldos, no resuelve el problema, aún deberíamos hacer la subconsulta siguiente para resolverlo:
En el ejemplo se ha tratado la vista como si fuera una relación más
Sin embargo, para el sistema gestor de bases de datos es una relación virtual por ser una vista
Al ser una relación virtual podemos hacer operaciones de consulta SELECT
Pero no podemos hacer operaciones de actualización como INSERT, UPDATE ó DELETE
En el ejemplo se ha creado una vista llamada prestamo(nombre_sucursal, total) que permite obtener los nombres de todas las sucursales y el saldo total que tienen
Como puede verse, es posible devolver cualquier atributo y trabajar normalmente con las consultas
En este caso se ha devuelto el atributo nombre_sucursal y se ha utilizado la función de agregación COUNT despues de usar la cláusula GROUP BY con los atributos nombre_sucursal y saldo
En el ejemplo se ha definido una vista a partir de otra para resolver la consulta que obtiene todos números de cuentas de la sucursal de ‘Navacerrada‘
Para ello hemos usado la vista llamada todas_las_cuentas
Ya que es tomado como una relación virtual para el sistema gestor de bases de datos por ser una vista
Hay que tener en cuenta que anidar vistas sobre si mismas puede producir un efecto recursivo y si están mal definidas bloquear la base de datos al caer en un bucle infinito
Actualización de vistas
Por norma general una vista no puede actualizarse, sin embargo un sistema gestor de bases de datos puede permitir hacerlo en casos concretos
Hay que consultar el manual del sistema gestor de bases de datos para saber en qué casos concretos lo permite y cómo lo resuelve
En el caso de que se permita su actualización, la vista debe cumplir:
- La cláusula FROM sólo tiene una relación
- La cláusula SELECT sólo contiene nombres de atributos de la relación, sin alias, valores agregados y sin la especificación DISTINCT
- Cualquier atributo que no aparece en la cláusula SELECT deberá ser definido como nulo
- La consulta no debe contener funciones de agregación (Cláusula GROUP BY, Cláusula HAVING)
DROP VIEW
Se puede utilizar el comando DROP VIEW para borrar una vista
Y sólo de esa vista, ya que no es capaz de trabajar sobre varias
La forma más habitual de consulta de borrado de vistas será:
\text{DROP VIEW v}
Donde v es el nombre de la vista
En el ejemplo se ha borrado la vista llamada todas_las_cuentas
Cláusula WITH
La cláusula WITH fue introducida en la norma SQL:1999 y permite definir una vista temporal
Esta vista temporal sólo puede ser usada en la consulta en la cuál ha sido definida
La forma más habitual será:
\text{WITH} v \text{AS} r_0\newline\\ \text{SELECT} A_1, \cdots, A_2, \cdots, A_n\\ \text{FROM} r_0, r_1, r_2, \cdots, r_m, r\\ \text{WHERE} P
Donde cada Ai representa a un atributo, cada ri una relación (r0 es una consulta), P es un predicado y v es el nombre de la vista temporal
Este ejemplo es equivalente a la vista que vimos en otro ejemplo anterior
Solo que en esta ocasión no hemos usado una vista definida en la base de datos
Hemos usado una vista temporal definida con la cláusula WITH