Vous êtes sur la page 1sur 5

Vistas

en
TRANSA
CT-SQL
Qu son y para qu las podemos usar?
Una vista crea una tabla virtual cuyo contenido (columnas y filas) se define mediante una consulta. Utilice esta
instruccin para crear una vista de los datos de una o varias tablas de la base de datos. Por ejemplo, una vista se
puede utilizar para lo siguiente:
Para centrar, simplificar y personalizar la percepcin de la base de datos para cada usuario.
Como mecanismo de seguridad, que permite a los usuarios obtener acceso a los datos por medio de la
vista, pero no les conceden el permiso de obtener acceso directo a las tablas base subyacentes de la vista.
Para proporcionar una interfaz compatible con versiones anteriores para emular una tabla cuyo esquema
ha cambiado.
La sintaxis para crear una vista es la siguiente:
CREATE VIEW [ schema_name . ] view_name [ (column [ ,...n ] ) ]
[ WITH <view_attribute> [ ,...n ] ]
AS select_statement
[ WITH CHECK OPTION ] [ ; ]

<view_attribute> ::=
{
[ ENCRYPTION ]
[ SCHEMABINDING ]
[ VIEW_METADATA ] }

Los argumentos de cada una de las partes de esta sintaxis:

schema_name
Es el nombre del esquema al que pertenece la vista.

view_name
Es el nombre de la vista. Los nombres de las vistas deben cumplir las reglas de los identificadores. La
especificacin del nombre del propietario de la vista es opcional.

column
Es el nombre que se va a utilizar para una columna en una vista. Solo se necesita un nombre de columna
cuando una columna proviene de una expresin aritmtica, una funcin o una constante; cuando dos o
ms columnas puedan tener el mismo nombre, normalmente debido a una combinacin; o cuando una
columna de una vista recibe un nombre distinto al de la columna de la que proviene. Los nombres de
columna se pueden asignar tambin en la instruccin SELECT.
Si no se especifica el parmetro column, las columnas de la vista adquieren los mismos nombres
que las columnas de la instruccin SELECT.

Nota
En las columnas de la vista, los permisos de un nombre de columna se aplican mediante una instruccin









AS
Especifica las acciones que va a llevar a cabo la vista.

select_statement
Es la instruccin SELECT que define la vista. Dicha instruccin puede utilizar ms de una tabla y otras
vistas. Se necesitan permisos adecuados para seleccionar los objetos a los que se hace referencia en la
clusula SELECT de la vista que se ha creado.
Una vista no tiene por qu ser un simple subconjunto de filas y de columnas de una tabla determinada. Es
posible crear una vista que utilice ms de una tabla u otras vistas mediante una clusula SELECT de
cualquier complejidad.
En una definicin de vista indizada, la instruccin SELECT debe ser una instruccin de una nica tabla o
una instruccin JOIN de varias tablas con agregacin opcional.
Las clusulas SELECT de una definicin de vista no pueden incluir lo siguiente:
Una clusula ORDER BY, a menos que tambin haya una clusula TOP en la lista de
seleccin de la instruccin SELECT
Importante
La clusula ORDER BY solo se usa para determinar las filas devueltas por la clusula
TOP u OFFSET en la definicin de la vista. Esta clusula no garantiza resultados
ordenados cuando se consulte la vista, a menos que tambin se especifique ORDER BY
en la propia consulta.
La palabra clave INTO
La clusula OPTION
Una referencia a una tabla temporal o a una variable de tabla
Dado que select_statement utiliza la instruccin SELECT, es vlido utilizar las sugerencias <join_hint> y
<table_hint> como se especifican en la clusula FROM.
En select_statement se pueden utilizar funciones y varias instrucciones SELECT separadas por UNION o
UNION ALL.



CHECK OPTION
Exige que todas las instrucciones de modificacin de datos ejecutadas en la vista sigan los criterios
establecidos en select_statement. Cuando una fila se modifica mediante una vista, WITH CHECK
OPTION garantiza que los datos permanezcan visibles en toda la vista despus de confirmar la
modificacin.
Nota
CREATE VIEW o ALTER VIEW, independientemente del origen de los datos subyacentes. Por
ejemplo, si se conceden permisos para la columna SalesOrderID en una instruccin CREATE VIEW,
una instruccin ALTER VIEW puede denominar a la columna SalesOrderID con un nombre de
columna distinto, por ejemplo OrderRef, y seguir teniendo los permisos asociados a la vista que utiliza
SalesOrderID.

Cualquier actualizacin realizada directamente en las tablas subyacentes de una vista no se
comprueba en la vista, aunque se haya especificado CHECK OPTION.

ENCRYPTION
Cifra las entradas de sys.syscomments que contienen el texto de la instruccin CREATE VIEW. El uso de
WITH ENCRYPTION evita que la vista se publique como parte de la replicacin de SQL Server.

SCHEMABINDING
Enlaza la vista al esquema de las tablas subyacentes. Cuando se especifica SCHEMABINDING, las
tablas base no se pueden modificar de una forma que afecte a la definicin de la vista. En primer lugar, se
debe modificar o quitar la propia definicin de la vista para quitar las dependencias en la tabla que se va a
modificar. Cuando se utiliza SCHEMABINDING, select_statement debe incluir los nombres de dos
partes (schema.object) de las tablas, vistas o funciones definidas por el usuario a las que se hace
referencia. Todos los objetos a los que se hace referencia se deben encontrar en la misma base de datos.
Las vistas o las tablas que participan en una vista creada con la clusula SCHEMABINDING no se
pueden quitar a menos que se quite o cambie esa vista de forma que deje de tener un enlace de esquema.
En caso contrario, Motor de base de datos genera un error. Adems, la ejecucin de las instrucciones
ALTER TABLE en tablas que participan en vistas que tienen enlaces de esquema provoca un error si
estas instrucciones afectan a la definicin de la vista.
VIEW_METADATA
Especifica que la instancia de SQL Server devolver a las API de DB-Library, ODBC y OLE DB la
informacin de metadatos sobre la vista en vez de las tablas base cuando se soliciten los metadatos del
modo de exploracin para una consulta que hace referencia a la vista. Los metadatos del modo de
exploracin son metadatos adicionales que la instancia de SQL Server devuelve a estas API del lado
cliente. Estos metadatos permiten a las API del lado cliente implementar cursores del lado cliente
actualizables. Los metadatos del modo de exploracin incluyen informacin sobre la tabla base a la que
pertenecen las columnas del conjunto de resultados.
Para las vistas creadas con VIEW_METADATA, los metadatos del modo de exploracin devuelven el
nombre de vista y no los nombres de tablas base cuando describen columnas de la vista en el conjunto de
resultados.
Cuando se crea una vista mediante WITH VIEW_METADATA, todas sus columnas, excepto una
columna timestamp, son actualizables si la vista tiene los desencadenadores INSTEAD OF INSERT o
INSTEAD OF UPDATE. Para obtener ms informacin acerca de las vistas actualizables, vea la seccin
Notas.
Notas importantes para la creacin de una vista
Una vista solo se puede crear en la base de datos actual. CREATE VIEW debe ser la primera
instruccin en un lote de consultas. Una vista puede tener un mximo de 1.024 columnas.
Cuando se realiza una consulta a travs de una vista, el Motor de base de datos se asegura de que
todos los objetos de base de datos a los que se hace referencia en algn lugar de la instruccin
existen, que son vlidos en el contexto de la instruccin y que las instrucciones de modificacin
de datos no infringen ninguna regla de integridad de los datos. Las comprobaciones que no son
correctas devuelven un mensaje de error. Las comprobaciones correctas traducen la accin a una
accin con las tablas subyacentes.
Si una vista depende de una tabla o vista que se ha quitado, el Motor de base de datos genera un
mensaje de error si alguien trata de utilizar la vista. Si se crea una nueva tabla o vista y la
estructura de la tabla no cambia con respecto a la tabla base anterior para sustituir a la eliminada,
se puede volver a utilizar la vista. Si cambia la estructura de la nueva tabla o vista, es necesario
eliminar la vista y volver a crearla.
Exite el tipo de lista llamada Vistas actualizables con las cuales es posible modificar los datos de una tabla base
subyacente mediante dicha vista. Para este tipo de vista existen ciertas restricciones:
Cualquier modificacin, incluidas las instrucciones UPDATE, INSERT y DELETE, debe hacer
referencia a las columnas de una nica tabla base.
Las columnas que se vayan a modificar en la vista deben hacer referencia directa a los datos
subyacentes de las columnas de la tabla. Las columnas no se pueden obtener de otra forma,
como las siguientes:
o Una funcin de agregado: AVG, COUNT, SUM, MIN, MAX, GROUPING, STDEV,
STDEVP, VAR y VARP.
o Un clculo. La columna no se puede calcular a partir de una expresin que utilice otras
columnas. Las columnas formadas mediante los operadores de conjunto UNION,
UNION ALL, CROSSJOIN, EXCEPT e INTERSECT equivalen a un clculo y
tampoco son actualizables.
Las columnas que se van a modificar no se ven afectadas por las clusulas GROUP BY,
HAVING o DISTINCT.
No se utiliza TOP con la clusula WITH CHECK OPTION en ningn punto de la instruccin
select_statement de la vista.
Si las restricciones anteriores le impiden modificar datos directamente mediante una vista, considere las
siguientes opciones:
Desencadenadores INSTEAD OF
Vistas con particiones

Ejemplos de creacin de vistas

A.Usar una instruccin CREATE VIEW sencilla
En el ejemplo siguiente se crea una vista mediante una instruccin SELECT sencilla. Una vista sencilla
resulta til cuando se consulta con frecuencia una combinacin de columnas. Los datos de esta vista
provienen de las tablas HumanResources.Employee y Person.Person de la base de datos
AdventureWorks2012. Los datos proporcionan el nombre e informacin sobre la fecha de contratacin de
los empleados de Adventure Works Cycles. Esta vista puede crearse para la persona responsable del
seguimiento de los aniversarios de trabajo pero sin concederle acceso a todos los datos de estas tablas.
Transact-SQL
USE AdventureWorks2012 ;
GO
IF OBJECT_ID ('hiredate_view', 'V') IS NOT NULL
DROP VIEW hiredate_view ;
GO
CREATE VIEW hiredate_view
AS
SELECT p.FirstName, p.LastName, e.BusinessEntityID, e.HireDate
FROM HumanResources.Employee e
JOIN Person.Person AS p ON e.BusinessEntityID = p.BusinessEntityID ;
GO
B.Usar WITH ENCRYPTION
En el siguiente ejemplo se utiliza la opcin WITH ENCRYPTION y se muestran columnas calculadas,
columnas con el nombre cambiado y varias columnas.
Transact-SQL
USE AdventureWorks2012 ;
GO
IF OBJECT_ID ('Purchasing.PurchaseOrderReject', 'V') IS NOT NULL
DROP VIEW Purchasing.PurchaseOrderReject ;
GO
CREATE VIEW Purchasing.PurchaseOrderReject
WITH ENCRYPTION
AS
SELECT PurchaseOrderID, ReceivedQty, RejectedQty,
RejectedQty / ReceivedQty AS RejectRatio, DueDate
FROM Purchasing.PurchaseOrderDetail
WHERE RejectedQty / ReceivedQty > 0
AND DueDate > CONVERT(DATETIME,'20010630',101) ;
GO
C.Usar WITH CHECK OPTION
En el siguiente ejemplo se muestra una vista denominada SeattleOnly que hace referencia a cinco tablas y
permite modificar datos aplicados nicamente a los empleados que viven en Seattle.
Transact-SQL
USE AdventureWorks2012 ;
GO
IF OBJECT_ID ('dbo.SeattleOnly', 'V') IS NOT NULL
DROP VIEW dbo.SeattleOnly ;
GO
CREATE VIEW dbo.SeattleOnly
AS
SELECT p.LastName, p.FirstName, e.JobTitle, a.City, sp.StateProvinceCode
FROM HumanResources.Employee e
INNER JOIN Person.Person p
ON p.BusinessEntityID = e.BusinessEntityID
INNER JOIN Person.BusinessEntityAddress bea
ON bea.BusinessEntityID = e.BusinessEntityID
INNER JOIN Person.Address a
ON a.AddressID = bea.AddressID
INNER JOIN Person.StateProvince sp
ON sp.StateProvinceID = a.StateProvinceID
WHERE a.City = 'Seattle'
WITH CHECK OPTION ;
GO
D.Usar funciones integradas dentro de una vista
En el siguiente ejemplo se muestra una definicin de vista que incluye una funcin integrada. Al utilizar
funciones, es necesario especificar un nombre de columna para la columna derivada.
Transact-SQL
USE AdventureWorks2012 ;
GO
IF OBJECT_ID ('Sales.SalesPersonPerform', 'V') IS NOT NULL
DROP VIEW Sales.SalesPersonPerform ;
GO
CREATE VIEW Sales.SalesPersonPerform
AS
SELECT TOP (100) SalesPersonID, SUM(TotalDue) AS TotalSales
FROM Sales.SalesOrderHeader
WHERE OrderDate > CONVERT(DATETIME,'20001231',101)
GROUP BY SalesPersonID;
GO

Vous aimerez peut-être aussi