Edgard Lucho 1 - SQL - Básico - cap07-V2-Vistas
Edgard Lucho 1 - SQL - Básico - cap07-V2-Vistas
Edgard Lucho 1 - SQL - Básico - cap07-V2-Vistas
Vistas
En este capítulo aprenderemos a construir vistas, un objeto de la
base de datos que almacena una consulta predefinida. Las vistas
ocultan la complejidad del modelo de datos y permiten que el
usuario se enfoque en la data que es relevante para él, además de
simplificar el diseño de consultas complejas y facilitar la
administración de los permisos.
En ocasiones, una consulta compleja se puede simplificar si previamente se
diseñan vistas que contienen consultas parciales que combinadas permiten llegar
al resultado final requerido. Adicionalmente, las vistas mejoran el rendimiento de
las consultas ya que la instrucción SELECT asociada se guarda compilada y con su
plan de ejecución ya definido.
1. VISTA
Una vista es un objeto que almacena una consulta predefinida y que proporciona
un modo alternativo de visualización de datos sin tener que redefinir la consulta.
Las tablas requeridas en una vista se llaman tablas base. Con algunas
excepciones, cualquier declaración SELECT puede nombrarse y guardarse como
una vista. Los ejemplos comunes de vistas incluyen:
USE QhatuPERU
GO
CREATE VIEW v_ListaPrecios
AS
SELECT LINEA.NomLinea, ARTICULO.CodArticulo,
ARTICULO.DescripcionArticulo,
ARTICULO.Presentacion,
ARTICULO.PrecioProveedor
FROM LINEA INNER JOIN ARTICULO
ON LINEA.CodLinea = ARTICULO.CodLinea
GO
P á g i n a 2 | 13
SELECT * FROM v_ListaPrecios
GO
Observe que para ejecutar la vista se utiliza la instrucción SELECT. Una vista se
manipula como si fuera una tabla; es decir, que se le puede aplicar las
declaraciones SELECT, INSERT, UPDATE y DELETE. Sin embargo, no debe ver la
vista como una tabla, sino pensar en ella como un programa que ejecuta una sola
instrucción (la instrucción SELECT).
P á g i n a 3 | 13
• WITH SCHEMABINDING enlaza la vista al esquema de las tablas subyacentes.
Cuando se crea una vista con enlace de esquema, las tablas subyacentes no se
pueden modificar ni eliminar.
• WITH CHECK OPTION indica que, si la definición de la vista contiene la cláusula
WHERE, y la vista se utiliza para operaciones de mantenimiento de datos, estas
operaciones deben respetar la condición definida en el WHERE.
• Para ejecutar la declaración CREATE VIEW, debe ser miembro de alguno de los
siguientes roles: sysadmin, db_owner, db_ddladmin, o debe tener el permiso
CREATE VIEW. Además, también debe tener el permiso SELECT en todas las
tablas o vistas que son referenciadas dentro de la vista.
• Para evitar situaciones en las que el dueño de una vista y el dueño de las tablas
subyacentes son distintos, se recomienda que el usuario dbo tenga todos los
objetos de una base de datos.
• Si la declaración SELECT de la vista contiene columnas computadas o
constantes, éstas deben tener un nombre asignado.
P á g i n a 4 | 13
Ejercicio 7.2: Reporte que muestra el balance del almacén de QhatuPERU
Este problema se resuelve fácilmente si crea una vista para las entradas, y una
segunda vista para las salidas. Luego, debe combinar las vistas anteriores para
obtener el reporte final.
USE QhatuPERU
GO
-- Vista para el listado de entradas
CREATE VIEW v_UnidadesEntrantes
AS
SELECT
ARTICULO.CodArticulo,
ARTICULO.DescripcionArticulo,
ISNULL
(
SUM( ORDEN_DETALLE.CantidadRecibida ), 0
) AS Entradas
FROM ARTICULO
LEFT OUTER JOIN ORDEN_DETALLE
ON ARTICULO.CodArticulo = ORDEN_DETALLE.CodArticulo
GROUP BY ARTICULO.CodArticulo,
ARTICULO.DescripcionArticulo
GO
-- Ejecución de la vista de entradas
SELECT * FROM v_UnidadesEntrantes
GO
P á g i n a 5 | 13
Creación de la vista para el reporte de salidas
USE QhatuPERU
GO
-- Vista para el listado de salidas
CREATE VIEW v_UnidadesSalientes
AS
SELECT
ARTICULO.CodArticulo,
ARTICULO.DescripcionArticulo,
ISNULL
(
SUM(GUIA_DETALLE.CantidadEnviada ), 0
) AS Salidas
FROM ARTICULO LEFT OUTER JOIN GUIA_DETALLE
ON ARTICULO.CodArticulo = GUIA_DETALLE.CodArticulo
GROUP BY ARTICULO.CodArticulo,
ARTICULO.DescripcionArticulo
GO
-- Ejecución de la vista de salidas
SELECT * FROM v_UnidadesSalientes
GO
P á g i n a 6 | 13
Combinación de las vistas para obtener el reporte final
USE QhatuPERU
GO
-- Combinación de las vistas para el balance
SELECT v_UnidadesEntrantes.CodArticulo,
v_UnidadesEntrantes.DescripcionArticulo,
v_UnidadesEntrantes.Entradas,
v_UnidadesSalientes.Salidas
FROM v_UnidadesEntrantes
INNER JOIN v_UnidadesSalientes
ON v_UnidadesEntrantes.CodArticulo =
v_UnidadesSalientes.CodArticulo
ORDER BY v_UnidadesEntrantes.CodArticulo
GO
P á g i n a 7 | 13
• Debido a que una vista es un objeto de la base de datos, puede asignarle
permisos de usuario. Esto es mucho más eficiente que colocar los mismos
permisos sobre columnas individuales en una tabla.
• Los datos pueden exportarse desde una vista por medio de la utilidad bcp.
Para averiguar cómo está definida una vista, puede ejecutar los siguientes
procedimientos almacenados del sistema para consultar las siguientes tablas del
catálogo de una base de datos:
USE QhatuPERU
GO
-- Consultado que objetos de tipo Vista contiene
-- la base de datos QhatuPERU
SELECT name FROM sys.sysobjects
WHERE type = 'V'
GO
P á g i n a 8 | 13
USE QhatuPERU
GO
-- Obteniendo las propiedades
-- de la vista v_ListaPrecios
sp_help v_ListaPrecios
GO
USE QhatuPERU
GO
-- Mostrando el código que ejecuta la vista
sp_helptext v_ListaPrecios
GO
USE QhatuPERU
GO
-- Mostrando los objetos que dependen de la vista
sp_depends v_ListaPrecios
GO
P á g i n a 9 | 13
3. MODIFICACIÓN Y ELIMINACIÓN DE UNA VISTA
A menudo, en respuesta a las demandas de los usuarios por información
adicional, o a los cambios en la definición de la tabla subyacente, es necesario
modificar la definición de una vista. Por ejemplo, si la tabla a la que una vista
hace referencia se ha eliminado, los usuarios recibirán un mensaje del error
cuando ellos intenten utilizar la vista. Se puede modificar una vista eliminándola y
luego recreándola, o ejecutando la sentencia ALTER VIEW.
Sintaxis
P á g i n a 10 | 13
3.2. Eliminación de una vista – La instrucción DROP VIEW
Sintaxis
Recomendación
Antes de encriptar una vista, asegúrese que la definición de vista (el script) se
guarde en un archivo. Para desencriptar el texto de una vista, debe eliminar y
luego recrear o modificar la vista utilizando la Sintaxis original.
USE QhatuPERU
GO
CREATE VIEW v_Inventario
WITH ENCRYPTION
AS
SELECT
LINEA.NomLinea, ARTICULO.CodArticulo,
ARTICULO.DescripcionArticulo,
ARTICULO.Presentacion,
ARTICULO.stockActual, ARTICULO.stockMinimo
FROM LINEA INNER JOIN ARTICULO
ON LINEA.CodLinea = ARTICULO.CodLinea
GO
P á g i n a 11 | 13
-- Consultando la vista
SELECT * FROM v_Inventario
GO
USE QhatuPERU
GO
-- Revisando la definición de la vista
sp_helptext v_Inventario
GO
Desde el punto de vista del usuario, una vista es una "tabla" ya que él puede
ejecutar sobre la vista las sentencias SELECT, INSERT, UPDATE y DELETE. Estas
sentencias ejecutadas sobre la vista afectan a las tablas dependientes de ella.
P á g i n a 12 | 13
• Las columnas no nulas que no son referenciadas en la vista pueden producir
error cuando se ejecuta una modificación a través de la vista.
• Si el SELECT asociado a la vista ha sido definido con una cláusula WHERE, el uso
de la opción WITH CHECK OPTION al momento de crear la vista hará que las
modificaciones que se hagan a través de ella respeten el criterio del WHERE.
4. EJERCICIOS PROPUESTOS
Para los siguientes ejercicios debe utilizar las bases de datos RH y EDUCA. Los
scripts para crearlas en su servidor los encontrará en el CD que acompaña al libro.
1. En la base de datos RH, crear una vista que muestre los siguientes datos:
2. En la base de datos EDUCA, crear una vista que muestre los siguientes datos:
P á g i n a 13 | 13