第 7章 视图的操作与管理视图概述视图是个虚表,是从一个或者多个表或视图中导出的表,其结构和数据是建立在对表的查询基础上的。
使用视图的优点和作用主要有:
( 1)视图可以使用户只关心他感兴趣的某些特定数据和他们所负责的特定任务,而那些不需要的或者无用的数据则不在视图中显示。
( 2)视图大大地简化了用户对数据的操作。
( 3)视图可以让不同的用户以不同的方式看到不同或者相同的数据集。
( 4)在某些情况下,由于表中数据量太大,因此在表的设计时常将表进行水平或者垂直分割,但表的结构的变化对应用程序产生不良的影响。而使用视图可以重新组织数据,从而使外模式保持不变,原有的应用程序仍可以通过视图来重载数据。
( 5)视图提供了一个简单而有效的安全机制。
7.1创建视图
SQL Server 2005提供了如下几种创建视图的方法:
( 1)用 SQL SERVER管理平台创建视图;
( 2)用 Transact-SQL语句中的 CREATE VIEW命令创建视图;
( 3)利用 SQL SERVER管理平台的视图模板来创建视图。
创建视图时应该注意以下情况:
( 1)只能在当前数据库中创建视图,在视图中最多只能引用 1024列,视图中记录的数目限制只由其基表中的记录数决定。
( 2)如果视图引用的基表或者视图被删除,则该视图不能再被使用,直到创建新的基表或者视图。
( 3)如果视图中某一列是函数、数学表达式、常量或者来自多个表的列名相同,则必须为列定义名称。
( 4)不能在视图上创建索引,不能在规则、默认、触发器的定义中引用视图。
( 5)当通过视图查询数据时,SQL Server要检查以确保语句中涉及的所有数据库对象存在,每个数据库对象在语句的上下文中有效,而且数据修改语句不能违反数据完整性规则。
( 6)视图的名称必须遵循标识符的规则,且对每个用户必须是惟一的。此外,该名称不得与该用户拥有的任何表的名称相同。
7.1.1利用 SQL SERVER管理平台创建视图利用 SQL SERVER管理平台创建视图的具体操作步骤如下:
( 1)在 SQL SERVER管理平台中,展开指定的服务器,打开要创建视图的数据库文件夹,选择指定的数据库,右击该数据库图标,从弹出的快捷菜单中依次选择“新建( New) → 视图”选项,
如图 7-1所示。接着就出现添加表、视图、函数对话框。如图 7-2所示。
图 7-1 选择新建视图选项对话框 图 7-2 添加表、视图、函数对话框
7.1.1利用 SQL SERVER管理平台创建视图
( 2)选择好创建视图所需的表、视图、函数后,通过单击字段左边的复选框选择需要的字段,如图 7-3所示。单击工具栏中的“保存”按钮,或者单击鼠标右键,从快捷菜单中选择保存选项保存视图,输入视图名,即可完成视图的创建。
图 7-3 选择视图字段对话框
7.1.2利用 Transact-SQL语句中的 CREATE
VIEW命令创建视图使用 Transact-SQL语句中的 CREATE VIEW创建视图,
其语法形式如下:
CREATE VIEW [schema_name.] view_name [(column
[,...n])]
[WITH <view_attribute> [,...n]]
AS
select_statement
[WITH CHECK OPTION]
< view_attribute >,:=
{ENCRYPTION|SCHEMABINDING|VIEW_METADATA}
7.1.2利用 Transact-SQL语句中的 CREATE
VIEW命令创建视图例 7-1 选择表 s和 sc中的部分字段和记录来创建一个视图,并且限制表 s中的记录只能是计算机系的记录集合,视图定义为 view_s。
程序清单如下:
create view view_s
as
select s.name,s.age,s.sex,
sc.cno,sc.score from s,sc
where s.sno=sc.sno and s.dept=’计算机’
例 7-2 创建一个视图,使之包含复杂的查询。
程序清单如下:
CREATE VIEW ExampleView
WITH SCHEMABINDING
AS
SELECT sno,SUM(score) AS Sumscore,COUNT(*) AS CountCol FROM sc
GROUP BY sno
7.1.2利用 Transact-SQL语句中的 CREATE
VIEW命令创建视图例 7-3 创建一个视图,使之包含字符串的运算。
程序清单如下:
CREATE VIEW v_shyjl(shyxh,shj,xm,jglb,phr,bzh) AS
Select
distinct shyxh,substring(shj,1,10)+""+zhi,
t01_shbshy.xm,t012_shyjl.jglb,t012_shyjl.phr,t012_shyjl.bzh
from t01_shbshy,t012_shyjl
where t012_shyjl.xm=t01_shbshy.xm
其中 shj列是从基表中取出两列并和一空字符串相加而得到的。
这些都为基表中字段间的灵活运算提供了极大方便,从而使我们可以随心所欲地定制符合自己要求的数据。
7.1.3 利用模板创建视图使用视图模板可以很容易地创建视图,其具体操作步骤如下;
( 1)在 SQL SERVER管理平台中,选择 view菜单中的“模板资源管理器,选项,
如图 7-4所示。
( 2)在出现的“模板资源管理器”选项中选择“创建视图”选项,如图 7-5所示。
( 3)按照提示输入视图名称,select语句后,执行此语句,即可创建视图。
图 7-4 选择工具菜单中的向导命令 图 7-5 创建视图模板
7.2 修改、删除和重命名视图
7.2.1 修改视图
7.2.2 重命名视图
7.2.3 查看视图信息,删除视图
7.2.1 修改视图修改视图的方法有以下两种方法:
( 1)在 SQL SERVER管理平台中,右击要修改的视图,从弹出的快捷菜单中选择“设计视图”选项,出现视图修改对话框。该对话框与创建视图时的对话框相同,可以按照创建视图的方法修改视图。
( 2)使用 ALTER VIEW语句修改视图,但首先必须拥有使用视图的权限,然后才能使用 ALTER VIEW语句,该语句的语法形式如下:
ALTER VIEW view_name
[( column[,...n]) ]
[WITH ENCRYPTION]
AS
select_statement
[WITH CHECK OPTION
7.2.1 修改视图例 7-4 修改了视图 V_employees,在该视图中增加了新的字段 employees.salary,并且定义一个新的字段名称 e_salary。
程序清单如下:
alter view dbo.employees
( number,name,age,e_salary)
as
select number,name,age,salary
from employees
where name=’张三’
7.2.2 重命名视图重命名视图方法有以下两种:
1,在 SQL SERVER管理平台中,选择要修改名称的视图,并右击该视图,从弹出的快捷菜单中选择“重命名”
选项。或者在视图上再次单击,也可以修改视图的名称。
接着该视图的名称变成可输入状态,可以直接输入新的视图名称。
2,使用系统存储过程 sp_rename来修改视图的名称,该过程的语法形式如下:
sp_rename old_name,new_name
例 7-5 把视图 v_all重命名为 v_part。
程序清单如下:
sp_rename v_all,v_part
7.2.3 查看视图信息、删除视图
1,查看视图信息可以使用系统存储过程 sp_help显示视图特征,使用 sp_helptext显示视图在系统表中的定义,使用 sp_depends显示该视图所依赖的对象。使用 SQL Server 查询分析器可以方便地显示视图属性信息,如图 7-7所示。图 7-8显示了使用 sp_helptext存储过程显示视图的创建语句。
图 7-7 显示视图属性对话框 图 7-8 显示视图创建语句
7.2.3 查看视图信息、删除视图
1,查看视图信息利用 select语句或 SQL SERVER管理平台可以查看视图的输出数据。在 SQL
SERVER管理平台中,右击某个视图的名称,从弹出的快捷菜单中选择“打开视图”选项,在 SQL SERVER管理平台中就会显示该视图的输出数据,如图 7-
9所示。
图 7-9 视图输出数据窗口
7.2.3 查看视图信息、删除视图
2,删除视图对于不再使用的视图,可以使用 SQL SERVER管理平台或者
Transact-SQL语句中的 DROP VIEW命令删除它。
使用 Transact-SQL语句 DROP VIEW删除视图,其语法形式如下:
DROP VIEW {view_name} [,…n]
可以使用该命令同时删除多个视图,只需在要删除的各视图名称之间用逗号隔开即可。
例 7-6 同时删除视图 v_student和 v_teacher。
程序清单如下:
drop view v_student,v_teacher
7.3 通过视图修改记录使用视图修改数据时,需要注意以下几点:
( 1)修改视图中的数据时,不能同时修改两个或者多个基表,可以对基于两个或多个基表或者视图的视图进行修改,但是每次修改都只能影响一个基表。
( 2)不能修改那些通过计算得到的字段,例如包含计算值或者合计函数的字段。
( 3)如果在创建视图时指定了 WITH CHECK OPTION选项,那么使用视图修改数据库信息时,必须保证修改后的数据满足视图定义的范围。
( 4)执行 UPDATE,DELETE命令时,所删除与更新的数据必须包含在视图的结果集中。
( 5)如果视图引用多个表时,无法用 DELETE命令删除数据,若使用
UPDATE命令则应与 INSERT操作一样,被更新的列必须属于同一个表。
7.3.1 插入数据记录例 7-7 创建一个基于表 employees的新视图 v_employees。
程序清单如下:
create view v_employees( number,name,age,sex,
salary)
as
select number,name,age,sex,salary
from employees
where name=’张三’
执行以下语句可向表 employees中添加一条新的数据记录:
Insert into v_employees
Values( 001,’李力’,22,’m’,2000)
7.3.1 插入数据记录例 7-8 首先创建一个包含限制条件的视图 v_employee2,限制条件为工资 >2000,然后插入了一条不满足限制条件的记录,再用 SELECT语句检索视图和表。
程序清单如下:
create view v_employee2
as
select * from employee
where 工资 >2000
go
insert into v_employee2
values( 002,’王则’,30,’f’,1000)
go
select * from employee
go
select * from v_employee2
go
7.3.1 插入数据记录例 7-9 在例子 7-8的基础上添加 WITH
CHECK OPTION选项。
程序清单如下:
create view v_employee3
as
select * from employee
where 工资 >2000
with check option
go
insert into v_employee3
values( 002,’王则’,30,’f’,1000)
go
select * from v_employee3
go
运行该程序将显示如下出错信息:
Server,Msg 550,Level 16,State
1,Line 1
The attempted insert or update
failed because the target view either
specifies WITH CHECK OPTION or
spans a view that specifies WITH
CHECK OPTION and one or more
rows resulting from the operation did
not qualify under the CHECK
OPTION constraint.
The statement has been
terminated.
7.3.2 更新和删除数据记录使用视图可以更新数据记录,但应该注意的是,更新的只是数据库中的基表。 使用视图删除记录,可以删除任何基表中的记录,直接利用 DELETE语句删除记录即可。但应该注意,必须指定在视图中定义过的字段来删除记录。
例 7-10 创建了一个基于表 employees的视图 v_employees,然后通过该视图修改表 employees中的记录。
程序清单如下:
create view v_employees
as
select * from employees
update v_employees
set name=’张然’
where name=’张三’
例 7-11 利用视图 v_employees删除表 employees中姓名为张然的记录。
程序清单如下:
delete from v_employees
where name=’张然’