1: CREATE VIEW v2 2: WITH ENCRYPTION,SCHEMABINDING,VIEW_METADATA 3: AS 4: SELECT OrderID FROM dbo.Orders 5: WITH CHECK OPTION 1),ENCRYPTION
如果你在构建任何类型的商业软件的时候,需要对视图进行加密的时候,这是一个不错的选项。
如果未指定ENCRYPTION选项,SQLSERVEr则以纯文本的形式保存用户定义的语句,如果指定了ENCRYPTION选项,对象的文本则会被混淆。
SQLSERVER提供了一个系统函数sp_helptext查看视图的文本,如果应用的ENCRYPTION选项,则会得到“The text for object ‘xx’ is encrypted”语句;
注:在加密之前一定要先备份你所要加密的视图,一旦加密,就不能回头。
1: CREATE VIEW CustomerWithOrder 2: WITH VIEW_METADATA 3: AS 4: 5: SELECT Customers.CustomerID,Customers.CompanyName FROM Customers 6: WHERE EXISTS(SELECT 1 FROM Orders WHERE Orders.CustomerID = Customers.CustomerID) 7:
1: ALTER VIEW CustomerWithOrder 2: WITH VIEW_METADATA 3: AS 4: 5: SELECT Customers.CustomerID,Customers.CompanyName FROM Customers 6: WHERE EXISTS(SELECT 1 FROM Orders WHERE Orders.CustomerID = Customers.CustomerID) 7: 8: WITH CHECK OPTION
然后再执行下面的语句:
1: INSERT INTO CustomerWithOrder(CustomerID,CompanyName) VALUES('ILSQL','MyReed')
你会收到以下错误:
Msg 550, Level 16, State 1, Line 2
试图进行的插入或更新已失败,原因是目标视图或者目标视图所跨越的某一视图指定了 WITH CHECK OPTION,而该操作的一个或多个结果行又不符合 CHECK OPTION 约束。
语句已终止。
6: SELECT col1 FROM dbo.T2 WHERE col1 IS NOT NULL;
7: CREATE UNIQUE CLUSTERED INDEX idx_col1 ON dbo.V2(col1);
然后我们向T2表中插入以下数据:
1: INSERT INTO t2(col1,col2) VALUES(1,'2') 2: INSERT INTO t2(col1,col2) VALUES(1,'3') 3: INSERT INTO t2(col1,col2) VALUES(null,'4') 4: INSERT INTO t2(col1,col2) VALUES(null,'5')