ECNRYPTION:对生成的视图进行加密
SCHEMABINDING:将视图与基表的构架进行绑定,如果进行了绑定,对任何关于基表结构的修改会报错.
CHECK Option:当对视图进行修改操作时,当修改的行是当前视图中使用的行时,将不允许修改
A :
use northwind
go
if object_id('dbo.VcustswithOrders') is not null
drop view dbo.VcustsWithOrders;
Go
create view dbo.VcustsWithOrders with encryption , schemabinding
as
select CustomerID, CompanyName,ContactName,Contacttitle,[Address],City,Region,PostalCode,Country,Phone,
fax
from dbo.Customers as C
where Exists (select 1 from dbo.Orders as O where O.CUstomerID=C.CustomerID);
GO
B:exec sp_helptext 'dbo.VcustsWithOrders';
执行B 返回:对象 'dbo.VcustsWithOrders' 的文本已加密。
C:alter table dbo.Customers drop column [address];
执行C 返回:
消息 5074,级别 16,状态 1,第 1 行
对象'VcustsWithOrders' 依赖于 列'address'。
消息 4922,级别 16,状态 9,第 1 行
由于一个或多个对象访问此列,ALTER TABLE DROP COLUMN address 失败。
-----------------------------------------------------------------------------------------------------------------------
CheckOption
A:
alter view dbo.VcustswithOrders with encryption , schemabinding
as
select customerID, CompanyName,ContactName,ContactTitle,
address, city,Region,PostalCode,Country,Phone, fax
from dbo.Customers as c
where exists(
select 1 from dbo.Orders as o
where o.CustomerID=C.CustomerId
) with check option;
B:
insert into dbo.Vcustswithorders(CustomerId,companyName)
values(N'FGHIJ',N'Company FGHIJ');
当执行B语句时,会得到如下错误:
消息 550,级别 16,状态 1,第 1 行
试图进行的插入或更新已失败,原因是目标视图或者目标视图所跨越的某一视图指定了 WITH CHECK OPTION,而该操作的一个或多个结果行又不符合 CHECK OPTION 约束。
语句已终止。
VIEW_METADATA
该选项的作用是,让视图看起来更像一个真正的表。不使用该选项,返回给客户端的api的元数据将是视图所依赖的基础表的数据;
如果客户端希望SqlServer发送视图的元数据信息,而不是基础表的元数据时,可以在创建或修改视图时指定此选项;是不是听的很费劲,听我慢慢说;
假设用户拥有对视图的操作权限,而没有对基础表操作的权限,那么用户对视图执行一些操作,如果指定了VIEW_METADATA选项,那么该语句将会违背安全而失败,因为只要指定了VIEW_METADATA那么返回给客户端就是视图的元数据,而不是基础表的元数据。另一方面,如果用户尝试通过视图修改数据,而该操作又与视图上定义的CHECK OPTION有冲突,这种操作只有直接提交到基础表,才有可能成功。