240 likes | 374 Views
第 9 章 视图. 本章教学概要. 主要内容 9.1 视图的概念 9.2 创建视图 9.3 使用视图的优点和缺点 9.4 创建视图示例 9.5 视图信息的查看 9.6 视图的修改、删除与重命名 9.7 视图数据的查询、插入、修改与删除 9.8 视图的安全性 教学目标 了解视图概念、优点及和数据表之间的主要区别 掌握创建、修改和删除视图的方法 掌握查看视图信息的方法 掌握通过视图修改数据表的方法. 9.1 视图的概念 .
E N D
本章教学概要 主要内容 9.1 视图的概念 9.2 创建视图 9.3 使用视图的优点和缺点 9.4 创建视图示例 9.5 视图信息的查看 9.6 视图的修改、删除与重命名 9.7 视图数据的查询、插入、修改与删除 9.8 视图的安全性 教学目标 了解视图概念、优点及和数据表之间的主要区别 掌握创建、修改和删除视图的方法 掌握查看视图信息的方法 掌握通过视图修改数据表的方法
9.1 视图的概念 • 视图是从一个或者多个表或视图中导出的表,其结构和数据是建立在对表的查询基础上的。和真实的表一样,视图也包括几个被定义的数据列和多个数据行,但从本质上讲,这些数据列和数据行来源于其所引用的表。因此,视图不是真实存在的基础表而是一个虚拟表,视图所对应的数据并不实际地以视图结构存储在数据库中,而是存储在视图所引用的表中。
9.2 创建视图 • 创建视图时应该注意以下情况: • ①只能在当前数据库中创建视图。 • ②如果视图引用的基表或者视图被删除,则该视图不能再被使用, • 直到创建新的基表或者视图。 • ③如果视图中某一列是函数、数学表达式、常量或者来自多个表的 • 列名相同,则必须为列定义名称。 • ④不能在视图上创建索引,不能在规则、缺省、触发器的定义中引 • 用视图。 • ⑤当通过视图查询数据时,SQL Server要检查以确保语句中涉及的 • 所有数据库对象存在,而且数据修改语句不能违反数据完整性规则。 • ⑥视图的名称必须遵循标识符的规则,且对每个用户必须是唯一的。 • 此外,该名称不得与该用户拥有的任何表的名称相同。
1. 使用Transact-SQL语句创建视图 • CREATE VIEW [ < owner > .] 视图名 [ ( 列名 [ ,...n ] ) ] • [WITH ENCRYPTION] • AS • Select 语句 • FROM 表名 WHERE 搜索条件 • [WITH CHECK OPTION] • 1. 创建视图的SQL语句的语法形式 • 其中:WITH CHECK OPTION:迫使通过视图执行的所有数据修改语句必须符合视图定义中设置的条件。 • WITH ENCRYPTION:对视图的定义进行加密。 • Select 语句:从表中或者视图中选择列构成新视图的列。
注意:在CREATE VIEW语句中,不能包括ORDER BY、COMPUTE或者COMPUTE BY子句,也不能出现INTO关键字。仅当使用 TOP关键字的时候,CREATE VIEW语句才能包括 ORDER BY子句。 • 创建视图所参考基表的列数最多为1024列。 • 创建视图不能参考临时表。 • 在一个批处理语句中,CREATE VIEW语句不能和其他Transact-SQL语句混合使用。 • 【例9-1】:选择表student和teacher中的部分字段和记录创建视图, • 并且限制表student中的记录只能是名称为“赵青”的记录集合,视图定 • 义为view_part,其程序清单如下: • create view view_part • as • Select student.name,student.age,student.sex,teacher.name,age,salary • From student,teacher • where student.name=’赵青’ • 2.使用企业管理器创建视图3.使用创建视图向导创建
9.3 使用视图的优点和缺点 • 1. 视图的优点 视图可以屏蔽数据的复杂性,简化用户对数据库的操作,还可以使用视图重新组织数据。 视图可以让不同的用户以不同的方式看到不同或者相同的数据集。 安全保护:视图可以定制不同用户对数据的访问权限。 • 2.视图的缺点 降低性能 限制修改
9.4 创建视图示例 • 创建水平视图 • 视图的常见用法是限制用户只能够存取表中的某些数据行,用这 • 种方法产生的视图称为水平视图,即表中行的子集。 • 【例9-2】在数据库JWGL的表student上创建一个视student_view1, • 视图的数据包括班级号为‘g99402’ 或‘g99403’所有学生的资料。 • USEjwgl • GO • CREATE VIEWstudent_view1 • AS • SELECT* FROM student • WHERE(class_id=’g99402’ OR class_id=’g99403’)
2. 创建投影视图 • 如果限制用户只能存取表中的部分列的数据,那么,使用这种 • 方法创建的视图就称为投影视图,即表中列的子集。 • 【例9-3】创建一个名为“studdent_view2” 的视图,它从数据库 • JWGL的student表中查询出性别为“男”的所有学生的姓名、性 • 别、家庭住址资料。 USEjwgl GO CREATE VIEWstudent_view2 AS SELECTstudent_idAS 学号 , student_nameAS 姓名 , sexAS性别 , class_idAS班级 , home_addrAS 家庭住址 , entrance_dateAS 入学 时间 , birthAS 出生年月 FROMstudent WHERE sex=1WITH CHECK OPTION
3. 创建联合视图 • 使用视图的一个原因是简化多表查询,可以生成从多个表中提取数 • 据的联合视图(joined View)把查询结果表示为一个单独的“可见表”。 • 【例9-4】创建一个名为“student_view3” 的视图,它是由表course、 • book及class_course创建的一个显示“g99402”班所开课程的课程名、 • 所用教材的教材名、出版社及作者的视图。 USEjwgl GO CREATE VIEWstudent_view3 WITH ENCRYPTION/* 加密视图 */ AS SELECTcourse.course_nameAS 课程名 , book.book_nameAS 书名 , book.publish_companyAS出版社 , book.authorAS 作者 FROM course , book , class_course WHERE(course.book_id = book.book_idANDclass_course.course_id= course.course_idAND class_course.class_id = 'g99402')
4. 创建包含集合函数的视图 • 在视图定义中可以包含GROUP BY和集合函数,从而将这些汇总数据放到一个“可见”的表中,允许用户对它们做进一步的查询。要注意,出现在SELECT子句中的列名,要么包含在集合函数中,要么包含在 GROUP BY 子句中。 • 【例9-5】使用集合函数SUM和GROUP BY子句以student_course表为基表,创建一个名为“student_sum_view4”、能显示所有学生学号和总成绩的视图。 USEjwgl GO CREATE VIEW student_sum_view4 (学号 , 总成绩) AS SELECTstudent_id , sum(grade)FROM student_course GROUP BYstudent_id • 注意:与水平视图和投影视图不同,本例产生的视图中的行与基本表中的行不是一一对应的,它是一些行数据的汇总,因此,不能通过视图来修改数据。
5. 创建视图的视图 • 前面创建的视图都是在表的基础上创建的,在视图的基础上还 • 可以创建视图。 • 【例9-6】从视图student_view1创建一个名为“student_view5”, • 能查询出班级名为“g99402”的所有学生资料的视图。 USEjwgl GO CREATE VIEWstudent_view5 AS SELECT * FROMstudent_view1 WHERE class_id = 'g99402'
9.5 查看视图信息 • 使用系统存储过程查看视图信息 sp_help 数据库对象名称 sp_helptext 视图(触发器、存储过程) sp_depends 数据库对象名称 • 1. 使用系统存储过程 ① 查看视图的名称、拥有者及创建日期等信息 sp_helpstudent_view1 ② 查看视图的定义脚本 sp_helptextstudent_view1 ③查看数据的来源 sp_depends student_view1 • 2. 使用企业管理器查看视图
9.6 视图的修改、删除与重命名 • 1. 视图的修改 • (1)利用企业管理器 修改视图。 • (2)使用ALTER VIEW语句修改视图 。 ALTER VIEW视图名 [视图中包含的列名] [WITH ENCRYPTION] ASSELECT 语句 [ WITH CHECK OPTION ] 其中: WITH CHECK OPTION:迫使通过视图进行 数据修改的所有语句必须符合视图定义中设置的条件。 WITH ENCRYPTION:对包含创建视图的SQL脚本 进行加密。
【例9-7】修改视图student_view1的定义,使其从student表中查询出性别为“女”的所有学生的资料。【例9-7】修改视图student_view1的定义,使其从student表中查询出性别为“女”的所有学生的资料。 • USEjwgl • GO • ALTERVIEWstudent_view1 • AS • SELECT* FROMstudent • WHEREsex = 0
2. 视图的删除 • (1)使用DROP VIEW语句删除视图: • DROP VIEW {视图名} [,…n] • 可以使用该命令同时删除多个视图,只需在要删除的视图名称之间用逗号隔开即可。 • 【例9-8】同时删除视图v_student和v_teacher其程序清单如下: • drop view v_student,v_teacher • (2)使用企业管理器删除视图。
3. 视图的重命名 • (1)可以使用系统存储过程sp_rename修改视图的名称: • sp_rename old_name,new_name • 【例9-9】:把视图v_all重命名为v_part,其程序清单如下: • sp_rename v_all,v_part • (2)利用企业管理器重命名视图
9.7 视图数据的查询、插入、修改与删除 • 1.用T-SQL语句进行视图数据的查询、插入、修改与删除 • . 从视图中查询数据 • 【例9-10】从视图student_view2中查询出学生姓名为“钱利”的学生资料。 USEjwgl GO SELECT * FROMstudent_view2 WHERE姓名='钱利' • 想一想,为什么WHERE子句不能用student_name=‘钱利’ ? • . 向视图插入数据 • 【例9-11】在PUBS数据库中首先创建了一个新的视图v_employees,该视图基 • 于表employees创建。 • create view v_employees(number, name, age, sex, salary) • as • select number, name, age, sex, salary from employees where name=’张三’ • Go • Insert into v_employees Values(001,’李力’,22,’m’,2000)
. 修改视图中的数据 • 使用视图可以更新数据记录,但应该注意的是,更新的只是数据库中的基表。 • 【例9-12】:在PUBS数据库中,创建了一个基于表employees的视图v_employees,然后通过该视图修改表employees中的记录。其程序清单如下: • create view v_employees • as • select * from employees • go • update v_employees • set name=’张然’ where name=’张三’
删除视图中的数据 • 使用视图删除记录,可以删除任何基表中的记录,直接利用DELETE语句删除记录即可。但应该注意,必须指定在视图中定义过的字段来删除记录。 • 【例9-13】:在PUBS数据库中,利用视图v_employees删除表employees中姓名为张然的记录。其程序清单为: • delete from v_employees • where name=’张然’ • 2. 用企业管理器进行视图数据的查询、插入、修改与删除
3.修改视图数据的限制 • 使用视图修改数据时,需要注意以下几点: • 修改视图中的数据时,不能同时修改两个或者多个基表,可以对基于两个或多个基表或者视图的视图进行修改,但是每次修改都只能影响一个基表。 • 不能修改那些通过计算得到的字段。 • 如果在创建视图时指定了WITH CHECK OPTION选项,那么所有使用视图修改数据库信息时,必须保证修改后的数据满足视图定义的范围。 • 执行UPDATE、DELETE命令时,所删除与更新的数据必须包含在视图的结果集中。 • 如果视图引用多个表时,无法用DELETE命令删除数据。
9.8 视图的安全性 • 创建视图时如果不加以限制,视图的定义脚本很容易地就可以被查看、修改,而且,修改视图数据的同时也修改了数据库中表的数据。因此,为了保证数据库表中数据及视图自身的安全,对视图的定义及使用必须采取一定的措施。 • 1. 对不同的用户授予不同的使用操作许可权限 • 数据库管理员可以针对不同的用户建立多个视图,然后对使用视图的用户授予不同的操作许可权限,必要时也可以撤消其对视图的操作许可权限。 • ⑴ 使用T-SQL语句进行视图操作许可权的管理 • 假设数据库JWGL中有一名为“abc”的用户,使用下列SQL语句可进行视图操作许可权的设置: • 授予用户abc创建视图权: • GRANT CREATE VIEW TO abc • 撤消用户abc的创建视图权: • REVOKE CREATE VIEW FROM abc • 授予用户abc对视图student_view2的查询、删除权: • GRANT SELECT , DELETE ON student_view2 TO abc • 撤消用户abc对视图stud_view2的查询、删除权: • REVOKE SELECT , DELETE ON student_view2 FROM abc
⑵ 使用企业管理器进行视图许可权的管理 • 2. 限制进入视图的数据 • 在创建视图的语句中,使用SELECT子句和WHERE子句来限制用户对基本表某些列和行数据的访问。 • 3. 创建加密视图 • 创建视图时,使用WITH ENCRYPTION关键字加密视图定义,防止其他用户查看最初的源代码。下图就是查看经过加密后视图student_view3的窗口,很显然窗口里的代码是不可识别。
本章教学小结 • 通过本章的学习,应掌握以下内容: • (1)视图是定义在一个或多个基表或视图上的一系列SQL • Select语句;视图可被看成是虚拟表或存储查询,目的是 • 提高数据库性能和安全性。 • (2)视图可以定义、更改和删除,其实现方法有两种:一 • 种是通过企业管理器;另一种是通过SQL语句实现。 • (3)通过视图可以查询基础表数据、更改基础表数据、删 • 除基础表数据和向基础表插入数据。