视图的依赖性

来源:互联网 发布:c语言视频教程哪个好 编辑:程序博客网 时间:2024/05/01 13:44
视图是一个基于其他对象的查询语句,这里的其他对象包括表,视图,实体化视图.通过视图可以得到以下好处:
1,提供表级别的安全性
2,隐藏数据的复杂性
3,提供简单的语句给用户
4,提供比基表更高的灵活性
5,保存复杂的查询
视图和构建视图的表或其他对象存在很强依赖关系,基表的改变会对视图产生很大的影响.这里以基于表的视图为例,说明一下视图的依赖性.

前提准备

一基表的建立

SQL> drop table test01;Table droppedSQL> create table test01  2  (id varchar2(3));Table created

二视图的建立

SQL> drop view view_test01;View droppedSQL> create view view_test01 as select * from test01;View created

三视图相关数据字典视图介绍

SQL> select view_name,text_length,text from user_views;VIEW_NAME   TEXT_LENGTH     TEXTVIEW_TEST01   25                  select "ID" from test01从这个结果可以看出:虽然建立视图时候用的语句是select * from test01,可是在数据库中存储的视图的定义为select "ID" from test01.这说明在数据库保存视图的时候会查询相关的数据字典把*翻译成相应的字段,这样操作有好的方面也有不好的方面.好的方面是可以提高视图查询时候的性能,不好的地方是在对表进行修改后可能会引起麻烦.SQL> select object_name,OBJECT_TYPE,STATUS from user_objects where OBJECT_NAME='VIEW_TEST01';OBJECT_NAME     OBJECT_TYPE        STATUS-------------------------------------------------------------------------------- ------------------ -------VIEW_TEST01           VIEW              VALID
从这个结果可以看到视图VIEW_TEST01的有效性.其中的VALID代表该视图此时是有效的,相应的INVALID代表该视图为失效的.


下面通过一系列测试来说明视图的依赖性
例子1:删除视图的基表

SQL> drop table test01;Table droppedSQL> select object_name,OBJECT_TYPE,STATUS from user_objects where OBJECT_NAME='VIEW_TEST01';OBJECT_NAME  OBJECT_TYPE        STATUS-------------------------------------------------------------------------------- ------------------ -------VIEW_TEST01    VIEW               INVALIDSQL> select * from VIEW_TEST01;select * from VIEW_TEST01ORA-04063: view "SUNWG.VIEW_TEST01" 有错误
当把视图VIEW_TEST01的基表test01删除后,在查询该视图的有效性,会发现此时该视图已经为失效的.对该视图进行查询会得到一个ora的错误.


例子2:重新添加视图的基表,并且保证新添加的基表与原基表一致

SQL> create table test01  2  (id varchar2(3));Table createdSQL> select object_name,OBJECT_TYPE,STATUS from user_objects where OBJECT_NAME='VIEW_TEST01';OBJECT_NAME        OBJECT_TYPE        STATUS-------------------------------------------------------------------------------- ------------------ -------VIEW_TEST01            VIEW               INVALIDSQL> select * from VIEW_TEST01;IDSQL> select object_name,OBJECT_TYPE,STATUS from user_objects where OBJECT_NAME='VIEW_TEST01';OBJECT_NAME          OBJECT_TYPE        STATUS-------------------------------------------------------------------------------- ------------------ -------VIEW_TEST01                VIEW               VALID
此时发现当重新创建原基表的时候,该视图的有效性仍然为失效的.可是当执行的关于这个视图的查询的时候可以发现可以正常的进行,不会引发任何错误.再次查询该视图状态的时候发现该视图已经变为有效.说明在查询视图的时候,数据库会先进行一个对视图的重新编译,用来检验视图的有效性.


例子3:重新添加视图的基表,并且保证新添加的基表与原基表不一致(视图查询的相关字段一致)
SQL> drop table test01;Table droppedSQL> create table test01  2  (id varchar2(3),  3  name varchar2(10));Table createdSQL> select * from VIEW_TEST01;ID---
可以发现此时仅可以查询到id这个字段,而新添加的字段name却不能查到.这个就是由于前面提交的数据库保存视图的机制决定的.视图在数据库中保存为一条查询语句,仅仅为’select id from test01’,所以即使对表添加了字段也不会在先前建立的视图中得到体现.


例子3:重新添加视图的基表,并且保证新添加的基表与原基表不一致(视图查询的相关字段不一致)
SQL> drop table test01;Table droppedSQL> create table test01  2  (id date);Table createdSQL> select * from VIEW_TEST01;ID-----------SQL> desc VIEW_TEST01;Name Type Nullable Default Comments ---- ---- -------- ------- -------- ID   DATE Y                     
此时发现虽然视图可以查询,但是查询的结果已经发生了变化,原来查询的id为varhchar的,而现在为date的.这也是由于前面提到的数据库保存视图的机制决定的.


从上面的例子可以看出,基表的改变会在很大程度上对此基表上的视图产生影响.所以在修改基表的时候一定要仔细检查一下此基表上的视图,消除产生错误的可能.

0 0
原创粉丝点击