《数据库应用基础第六章视.ppt》由会员分享,可在线阅读,更多相关《数据库应用基础第六章视.ppt(36页珍藏版)》请在三一办公上搜索。
1、1,第六章视图,2,复习,什么是数据完整性?数据完整性的分类?,3,1 什么是数据完整性?,数据的一致性和准确性,实体完整性域完整性引用完整性用户自定义完整性,数据完整性的分类,行,列,表,表,4,本章主要内容,6.1 视图概述6.2 创建视图6.3 视图的修改和删除,5,6.1 视图概述,1 视图的基本概念,2 使用视图的优点和缺点,(1)隐蔽数据库的复杂性(2)控制用户提取数据(3)简化数据库用户管理(4)改进性能,6,1 视图的基本概念,数据视图是另一种在一个或多个数据表上观察数据的途径,可以把数据视图看作是一个能把焦点定在用户感兴趣的数据上的监视器,用户看到的是实时数据,视图可以被看成
2、是虚拟表或存储查询,用户可以通过视图来插入、更改和删除数据,7,例6-1:图书管理员现在需要查询图书的借用历史记录,确认图书的借用情况,目前有几本图书被借出,由哪些人借用,借用日期是何时。图书的名称,借阅人的名字以及相关借用日期,分别存在三个不同的表book_info、borrower_info和lend_list内,给SQL查询带来的一定的复杂性。采用视图的方法,能够很好的解决该问题。视图可以使得所有需要显示的图书借用信息好像都记录在一张表内一样。下面建立系统中的视图lendbook:,8,use Library_DBgoCREATE VIEW lendbook ASSELECT lend_
3、list.book_id,lend_list.borrower_id,lend_list.lend_date,lend_list.back_date,book_info.name AS bookname,borrower_info.nameFROM lend_list INNER JOIN book_info ON lend_list.book_id=book_info.book_id INNER JOIN borrower_info ON lend_list.borrower_id=borrower_info.id,需要查询所需的图书借阅历史记录时,只需执行如下查询语句:SELECT*FRO
4、M lendbook,9,2 使用视图的优点和缺点,(1)隐蔽数据库的复杂性 开发者可以在不影响用户使用数据库的情况下可以改变数据库内容,即使在基表发生更改或重新组合的情况下,用户还能够通过视图获得一致和非变化的数据。,10,2 使用视图的优点和缺点,(2)控制用户提取数据 通过将某些不需要的、敏感的或是不适当的数据控制在视图之外,可以实现为用户定制其个人所使用的表。实际上这也是一种安全机制。用户可以访问某些数据,进行查询和修改,但是表或数据库的其余部分是不可见的,也不能进行访问。,11,2 使用视图的优点和缺点,(3)简化数据库用户管理 通过定义不同的视图及有选择地授予视图上的权限,可以将用
5、户、组或角色限制在不同的数据子集内。,12,2 使用视图的优点和缺点,(3)简化数据库用户管理,可以将访问限制在基表中行的子集内。可以将访问限制在基表中列的子集内。可以将访问限制在基表中列和行的子集内。可以将访问限制在符合多个基表联接的行内。可以将访问限制在基表中数据的统计汇总内。可以将访问限制在另一个视图的子集内或视图和基表组合的子集内。,例:定义一个视图,其中只含有管理类书籍或计算机应用类书籍的行,向用户隐藏有关其它类型书籍的信息。,例:定义一个视图,其中含有books表中的所有行,但省略了 price 和 discount 列等敏感信息。,例:定义一个视图,其中只含有管理类书籍或计算机应
6、用类书籍的行,同时含有books表中除了price 和 discount 列的其他列,隐藏了其他书籍信息和敏感列的信息。,例:定义一个视图,它联接表 books和authors表以显示作者姓名及其撰写的书籍。该视图隐藏作者的个人信息以及著作的财务信息。,例:定义一个视图,其中只含有每类书籍的平均价格。,13,2 使用视图的优点和缺点,(4)改进性能 通过在视图中存储复杂查询的运算结果并为其他查询提供这些摘要性的结果使数据库的性能得到提高,视图还具备分割数据的功能,而且可以把分割后独立的数据放置在不同的计算机上。,14,6.2 创建视图,1 视图的创建,2 视图定义信息查询,(1)使用Micro
7、soft SQL Server Management Studio管理界面(2)通过执行系统存储过程 查看视图的定义信息,15,1 视图的创建,CREATE VIEW.view_name(column,.n)WITH ENCRYPTION AS select_statement WITH CHECK OPTION,16,例6-2:本例建立的是系统中另外一个非常有用的视图book_info_view,通过这个视图,系统可以很容易的从表book_info、class和book_state中查询完整的图书信息,以方便显示给用户进行查看。,17,use Library_DBgoCREATE VIEW
8、book_info_view ASSELECT book_info.book_id,book_info.name,book_info.author,book_info.publish,book_info.ISBN,book_info.introduction,book_info.language,book_info.price,book_info.pressmark,class.name AS classname,book_state.leftnum,book_state.number,book_info.class_idFROM book_info INNER JOIN book_state
9、 ON book_info.book_id=book_state.book_id INNER JOIN class ON book_info.class_id=class.class_id,18,2 视图定义信息查询,(1)使用Microsoft SQL Server Management Studio管理界面 运行“Microsoft SQL Server Management Studio管理界面”,在Library_DB下的视图中选择dbo.book_info_view,单击鼠标右键,在弹出的快捷菜单中讯则“属性”项,便可查看视图book_info_view属性,19,2 视图定义信息查
10、询,(2)通过执行系统存储过程查看视图的定义信息 可以通过执行系统存储过程sp_helptext查看视图的定义信息 EXEC sp_helptext objname,用户需要查看的视图名称,20,2 视图定义信息查询,(2)通过执行系统存储过程查看视图的定义信息 例:EXEC sp_helptext book_info_view,21,2 视图定义信息查询,(2)通过执行系统存储过程查看视图的定义信息 可以通过运行系统存储过程sp_depends来获得视图对象的参照对象和字段 EXEC sp_depends objname,用户需要查看的视图名称,22,2 视图定义信息查询,(2)通过执行系统
11、存储过程查看视图的定义信息 例:EXEC sp_depends book_info_view,23,2 视图定义信息查询,(2)通过执行系统存储过程查看视图的定义信息 例:查询数据库中定义的所有视图 EXEC sp_depends book_info_view,24,在定义视图时使用加密语句例6-3:通过WITH ENCRYPTION子句创建一个与例6-2相同的加密视图,将加密的新视图取名为book_info_view2。,25,use Library_DBgoCREATE VIEW book_info_view2WITH ENCRYPTION AS SELECT book_info.book
12、_id,book_info.name,book_info.author,book_info.publish,book_info.ISBN,book_info.introduction,book_info.language,book_info.price,book_info.pressmark,class.name AS classname,book_state.leftnum,book_state.number,book_info.class_idFROM book_info INNER JOIN book_state ON book_info.book_id=book_state.book_
13、id INNER JOIN class ON book_info.class_id=class.class_id,通过使用WITH ENCRYPTION 子句,用户将无法象浏览视图book_info_view的视图定义一样浏览视图book_info_view2的视图定义,26,6.3 视图的修改和删除,1 视图的修改,2 视图的删除,3 通过视图修改数据,27,1 视图的修改,ALTER VIEW.view_name(column,.n)WITH ENCRYPTION AS select_statement WITH CHECK OPTION,28,例6-4:对例6-4创建的视图book_in
14、fo_view2进行修改,将该视图中的记录的字段减少为图书名称、所属分类名、剩余库存和总数量。,29,use Library_DBgoALTER VIEW book_info_view2AS SELECT book_info.name,class.name AS classname,book_state.leftnum,book_state.numberFROM book_info INNER JOIN book_state ON book_info.book_id=book_state.book_id INNER JOIN class ON book_info.class_id=class.
15、class_id,30,2 视图的删除,DROP VIEW.view_name(column,.n),要删除的视图名,31,例6-5:删除Library_DB数据库中的视图book_info_view2。,DROP VIEW dbo.book_info_view2,32,3 通过视图修改数据,在视图中修改的数据操作都将导致对基表数据的修改,在通过视图修改数据时应注意以下几个问题:,不能对某些特别列进行操作;不能在视图中修改在视图中没有参照的列;不能在含有视图中没有参照的列的表中利用视图作插入操作;不能影响多于一个的基表;如果某一视图在定义中指定了WITH CHECK OPTION选项,则进行数
16、据修改时将进行验证。,33,例6-6:通过WITH CHECK OPTION子句将强制对视图所作的所有修改都满足定义视图的select _statement中指定的条件。,34,CREATE VIEW lendbook2AS SELECTbook_id,borrower_id,lend_date,back_datefrom lend_listwhere book_id=0284WITH CHECK OPTION,通过查询语句:use Library_DBgoSELECT book_id,borrower_id,lend_date,back_dateFROM lend_listWHERE book_id=0284,35,通过UPDATE子句将borrower_id为970890的借阅记录的back_date由原来的NULL改为2010-4-22。UPDATE lendbook2SET back_date=2010-4-22WHERE borrower_id=970890,36,通过UPDATE子句将broorwer_id为981123的借书记录中的图书编号book_id由原来的0284改为0234。UPDATE lendbook2SET book_id=0234WHERE borrower_id=981123,