本帖最后由 吴愿涛 于 2012-10-27 20:36 编辑
使用视图大致有两个方面的原因。
1.封装查询
数据库虽然可以存储海量数据,但是在数据表设计上却不可能为每种关系创建数据表。例如,对于学生表,存储了学生信息,学生的属性包括学号、姓名、年龄、家庭地址等信息;而学生成绩表只存储了学生学号、科目、成绩等信息。现需获得学生姓名及成绩信息,那么就需要创建一个关系,该关系需要包含学生姓名、科目、成绩。但为该关系创建一个新的数据表,并利用实际信息进行填充,以备查询使用,是不适宜的。因为这种做法很明显的造成了数据库中数据的大量冗余。
视图则是解决该问题的最佳策略。因为视图可以存储查询定义(或者说关系运算),那么,一旦使用视图存储了查询定义,就如同存储了一个新的关系。用户可以直接对视图中所存储的关系进行各种操作,就如同面对的是真实的数据表。
2.灵活的控制安全性
一个数据表可能含有很多列。但是这些列的信息,对于不同角色的用户,可访问的权限有可能不同。例如,在员工表中,可能存在着员工工号、员工姓名、员工年龄、员工职位、员工家庭住址、员工社会关系等信息。对于普通用户(例如普通员工),有可能需要访问员工表,来查看某个工号的员工的姓名、职位等信息,而不允许查看家庭住址、社会关系等信息;对于高级用户(例如人事经理),则需要关注所有信息。那么,这就涉及数据表的安全性。
利用视图可以灵活地实现这一策略。例如,可以首先创建名为vw_employees的视图。该视图的查询定义为,选择员工表中员工工号、员工姓名、员工职位等3列。这相当于在员工关系中,进行投影运算,即选择员工工号、员工姓名、员工职位这3个属性,形成新的关系,如图11-2所示。
图11-2 利用投影运算获得普通用户使用的视图vw_employees
同样,对于高级用户,可以创建名为vw_employees_hr的视图,该视图选择员工表中所有列,如图11-3所示。
图11-3 利用投影运算获得HR用户使用的视图vw_employees_hr
然后,对于两种角色,分别分配两个视图的查询权限,与实际的数据表employees隔离开来,从而控制数据访问的安全性。
视图和表相比有安全灵活的有点。
经常用到的查询,或较复杂的联合查询应当创立视图,这是会优化性能的
还有就是涉及到权限管理方面,比如某表中的部分字段含有机密信息,不应当让低权限的用户访问到的情况,这时候给这些用户提供一个适合他们权限的视图,供他们阅读自己的数据就行了。
当一个查询逻辑复杂,且别的查询需要查询这个查询的结果时
用视图
还有就是敏感数据
1、的确的看你的需求了,处理比复杂的逻辑或多表的连接查询你最好用存储过程,这样可以提高你的服务器性能。
2、视图本身是一张虚拟表,处理表与表关系不太复杂操作时也可以用了。
3、触发器一般用在多表间级联操作更新或删除一个表中某个字段,那么相关其他表也一同更新或删除呀!
通过限制可由用户使用的数据,可以将视图作为安全机制。用户可以访问某些数据,进行查询和修改,但是表或数据库的其余部分是不可见的,也不能进行访问。无论在基础表(一个或多个)上的权限集合有多大,都必须授予、拒绝或废除访问视图中数据子集的权限。
由于查询和视图有如此多的相似性,所以很容易忽略它们之间的差异。本节对查询和视图做一个简单的比较。
存储 视图存储为数据库设计的一部分,而查询则不是。当设计数据库时,可以出于下列原因将视图包括在设计中:
一些数据子集关系到许多用户。由于每个视图都存储在数据库内,所以视图建立特定的数据子集以供任何数据库用户使用。
视图可以隐藏基表。可以禁止所有用户访问数据库表,而要求用户只能通过视图操作数据。这种方法可以保护用户和应用程序不受某些数据库修改的影响。例如,如果可以创建一个名为 "本月销售额 "的视图。在每月的第一天,可以相应地修改视图的定义。如果没有这个视图,用户每月都必须重新编写查询以选择相应月份的销售额。
更新结果 对视图和查询的结果集更新限制是不同的。有关更多信息,请参见结果更新规则。
排序结果 可以排序任何查询结果,但是只有当视图包括 TOP 子句时才能排序视图。有关 TOP 子句的更多信息,请参见使用 TOP 和 PERCENT 限制结果集。
生成查询计划 查询计划是内部策略,通过它数据库服务器尝试快速创建结果集。数据库服务器可以在保存视图后立即为视图建立查询计划。但是对于查询,数据库服务器直到查询实际运行时才能建立查询计划——也就是说,直到用户显式请求结果集时。
参数设置 可以为查询创建参数,但不能为视图创建参数。有关参数化查询的更多信息,请参见创建通用查询。
加密 可以加密视图,但不能加密查询。有关更多信息,请参见加密视图。
|
|