视图的目的:
1.为终端用户减少明显的数据库复杂性
2.防止敏感的列被选择,但是仍然提供对其他重要数据的访问
3.给数据库添加额外的索引以提高查询性能--甚至在没有使用索引所基于的视图时也是如此
试图实际上就是一个存储查询。
10.1 简单的视图
CREATE VIEW <view name>
AS
<SELECT statement>
扩展语法:
CREATE VIEW [schema_name].<view name> [<column name list>]
[WITH [ENCRYPTION] [,SCHEMABINDING] [,VIEW_MEDADATA]]
AS
<SELECT statement>
WITH CHECK OPTION
CREATE VIEW StudentsInfoView
AS
SELECT StudentNo,StudentName,StudentAddr
FROM students;
SELECT * FROM StudentsInfoView;
视图实际上只是一个用户不可见的SELECT语句,所以用户可以忽略SELECT语句所说明的,而只将其产生的结果看做像表一样。
10.2 更加复杂的视图
视图最常见的一个用途可能是展开数据-也就是本章开头所说的消除复杂性。
WHERE CAST(soh.OrderDate AS Date) =
CAST(DATEADD(day,-1,GETDATE()) AS Date)
我们想将SalesOrderHeader表中的OrderDate与GETDATE减一天直接进行比较
使用视图更改数据-不使用INSTEAD OF触发器
在通过视图改变数据时,要记住以下一些内容:
a)如果视图包含连接,在大多数情况下,除非使用INSTEAD OF触发器,否则不能对数据执行INSERT或者DELETE操作。有时(不要只更新来自单个表的列),UPDATE可以不使用INSTEAD OF触发器来工作。
b)如果视图仅仅引用单个表,那么在表中所有必须字段都在视图中或者有默认值的情况下,可以通过使用视图而不使用INSTEAD OF触发器来对数据执行INSERT操作。
10.3 使用T-SQL编辑视图
ALTER VIEW语句和CREATE VIEW语句的区别有以下几点:
a)ALTER VIEW期望找到一个已有的视图,而CREATE则不是。
b)ALTER VIEW保留了视图上已经建立的任何权限。
c)ALTER VIEW保留了任何依赖信息。
第二点是非常重要的。如果先执行DROP,然后使用CREATE,那么其效果与使用ALTER VIEW语句几乎是一样的。
10.4 删除视图
DROP VIEW <view name>,[<view name>,[...n]]
10.7 保护代码:加密视图
加密视图所有必须做的工作是使用WITH ENCRYPTION选项。
a)WITH ENCRYPTION跟在视图的名称之后,但是在AS关键字之前
b)WITH ENCRYPTION不使用OPTION关键字
10.11 本章小结
1.避免基于视图构建视图-而应该将来自第一个视图的合适的查询信息应用到新的视图中。
2.记住使用WITH CHECK OPTION的视图提供了一些普通CHECK约束所不具备的灵活性。
3.如果不希望其他人能看见您的源代码,就加密视图,但要记得备份未加密的代码,因为在加密后就不能再恢复未加密的代码了。
4.除了权限之外,使用ALTER VIEW意味着完全替换了现有的视图。。这以为着如果要使用被修改的视图里的加密和限制仍然是有效的,那么必须在ALTER语句里包含WITH ENCRYPTION和WITH CHECK OPTION子句。