SQL Server - 视图
在Sql server中不仅可以使用SELECT语句查询数据,也可以使用视图来完成查询工作。视图还可以简化数据库操作,提高数据库的安全性。
视图是虚拟的表。使视图成为“虚拟的”而不是“真正”的表的原因是,在视图中看到的数据存储在用于创建视图的表中,而不是存在于视图本身。
视图和查询的区别:
1)、存储:视图存储于数据库设计的一部分,而查询则不同。视图可以禁止所有用户访问数据库的基表,而要求用户只能通过视图操作数据。这种方法可以保护用户和应用不受某些数据库修改的影响,同样也可以保护数据库的安全性。
2)、排序:可以排序任何查询结果,但是只有当视图包括TOP子句时才能排序视图。
3)、加密:可以加密视图,但不能加密查询。
视图的优点:
1)、简化操作:视图可以使比较复杂的多表关联查询,在每次执行相同的查询时,只需要一条简单的查询视图语句,就可以解决复杂的查询问题。视图降低了操作的复杂性,简化的用户的操作。
2)、建立前台和后台的缓冲:在数据库开发过程中,可以通过调用视图来实现查询功能。通过对视图的调用,在数据库表结构更改时,只有视图的输出列不发生变化,就可以避免对应用程序的修改,这样大大提高了数据库的开发效率,降低了开发成本。
3)、合并分隔数据:通过视图可以对表中的数据进行水平分隔或者垂直分隔。用户可以对一个表或多个表中的数据列进行有选择的查看,简化数据结构,并可以通过在视图中使用where子句水平分隔数据,限制表中显示的数据。
4)、提高安全性:视图可以作为一种安全机制,通过视图可以限定用户查看和修改数据表或列,其他的数据信息只能是有访问权限的用户才能查看和修改。
创建视图:
Create view view_name [(column [,...n])]
[With<view_attribute>[,...n]]
AS
select_statement
[WIth Check option]
注释:
view_name:视图的名称
column:定义视图中的字段名。如果没有指定,则视图字段获得与select语句中的字段相同的名称。但对于以下情况必须指定字段名:
1)、视图是从多个表中产生的,对于表中的数据列重名时
2)、当列是从算术表达式,函数或常量派生得到的
3)、’当视图中的某些列不同于原表中列的名称时。
With<view_attribute>: view_attribute有以下3中参数
1)、ENCRYPTION表示对视图文本进行加密
2)、SCHEMABIDING将视图绑定到架构上。指定SCHEMABIDING时,select_statement必须包含所引用的表,视图或用户定义函数的两部分名称(owner.object);select语句中不可以使用*进行查询。
3)、VIEW_METADATA表示如果某一查询中引用该视图且要求返回查看模式的元数据时,那么sql server将向DBLIB和OLB DB APIS返回视图的元数据信息,而不是一个基表或表。
AS:视图要执行的操作
select_statement:定义视图的查询语句。该语句可以引用多个表或其他视图。查询语句的限制:
1)、不能包含compute或computeby语句
2)、不能包含order by子句,除非在select语句的选择列表中也有一个top子句。
3)、不能包含into子句
4)、不能引用临时表或变量
WITH CHECK OPTION:规定在视图上执行的所有数据修改语句都必须符合有select_statement设置的准则。通过视图修改记录,with check option可确保提交修改后,仍可以通过视图看到修改的数据。
sp_helptext:系统存储过程是用来显示规则,默认值,未加密的存储过程,用户定义函数,触发器或视图文本。
视图重命名
在sql server中,使用sp_rename修改视图的名称
sp_rename [@object=] 'object_name',
[@new_name=] 'new_name'
[,[@objecttype=] 'object_type'
注释:
object_name:用户对象(表,视图,列,存储过程,触发器,默认值,数据库,对象或规则)或数据类型的当前名称。如果要命名的是对象中的一列,object_name必须为table.column形式。
new_name:指定对象的新名称
objecttype:要重命名对象的类型。
exec sp_rename 'table_order' , 'view1'
修改视图:
Alter view view_name [(column [,...n])]
[With<view_attribute>[,...n]]
AS
select_statement
[WIth Check option]
注意:Alter view语句不支持在已有视图中添加,删除一个或者多个单独列或者改变其他类型的操作。
Alter View 和Drop view之后 Create view的区别:
在通过Drop view语句删除视图时,数据库管理系统自动删除在视图上创建的任何触发器。然后,当重新创建视图时,系统不仅不恢复视图上的触发器,也不向对原视图拥有的权限的用户(或角色)授予(grant)任何访问权限。
使用系统存储过程sp_help或者sp_helptext来获取视图的定义信息。
sp_help:报告有关数据库对象,用户定义数据类型或sql server所提供的数据类型的信息
sp_helptext:用来显示规则,默认值,未加密的存储过程,用户定义函数,触发器或视图的文本。
视图创建以后,系统将这个视图的定义存储在系统表systemcomments中,通过执行系统存储过程sp_helptext或直接打开系统表systemcomments,可以查看视图的定义文本。Sql server为了保护视图的定义,提供了with encryption子句,可以防止其他用户查看视图的代码,或是进行发布时对源代码隐藏。
对视图权限的设置,可以对不同的用户使用视图时进行限制。
通过视图限制用户对列的访问
视图时虚拟表,几乎可以在任何允许表引用的地方使用视图,但视图不是与数据库中的其他表和索引一样存储在硬盘上的物理表,视图是由一个或多个基表(或其他视图)的行和列中提供的数据的select语句组成的。使用视图的真正好处之一可以隐藏不想让其他用户看到的部分表的能力。