ITPub博客

首页 > 数据库 > Oracle > 视图的依赖性

视图的依赖性

原创 Oracle 作者:sunwgneuqsoft 时间:2007-12-01 09:31:44 0 删除 编辑

视图是一个基于其他对象的查询语句,这里的其他对象包括表,视图,实体化视图.通过视图可以得到以下好处:

1,提供表级别的安全性

2,隐藏数据的复杂性

3,提供简单的语句给用户

4,提供比基表更高的灵活性

5,保存复杂的查询

[@more@]

视图和构建视图的表或其他对象存在很强依赖关系,基表的改变会对视图产生很大的影响.这里以基于表的视图为例,说明一下视图的依赖性.

前提准备

一基表的建立

SQL> drop table test01;

Table dropped

SQL> create table test01

2 (id varchar2(3));

Table created

二视图的建立

SQL> drop view view_test01;

View dropped

SQL> create view view_test01 as select * from test01;

View created

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

SQL> select view_name,text_length,text from user_views;

VIEW_NAME TEXT_LENGTH TEXT

VIEW_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 dropped

SQL> select object_name,OBJECT_TYPE,STATUS from user_objects where OBJECT_NAME='VIEW_TEST01';

OBJECT_NAME OBJECT_TYPE STATUS

-------------------------------------------------------------------------------- ------------------ -------

VIEW_TEST01 VIEW INVALID

SQL> select * from VIEW_TEST01;

select * from VIEW_TEST01

ORA-04063: view "SUNWG.VIEW_TEST01" 有错误

当把视图VIEW_TEST01的基表test01删除后,在查询该视图的有效性,会发现此时该视图已经为失效的.对该视图进行查询会得到一个ora的错误.

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

SQL> create table test01

2 (id varchar2(3));

Table created

SQL> select object_name,OBJECT_TYPE,STATUS from user_objects where OBJECT_NAME='VIEW_TEST01';

OBJECT_NAME OBJECT_TYPE STATUS

-------------------------------------------------------------------------------- ------------------ -------

VIEW_TEST01 VIEW INVALID

SQL> select * from VIEW_TEST01;

ID

SQL> 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 dropped

SQL> create table test01

2 (id varchar2(3),

3 name varchar2(10));

Table created

SQL> select * from VIEW_TEST01;

ID

---

可以发现此时仅可以查询到id这个字段,而新添加的字段name却不能查到.这个就是由于前面提交的数据库保存视图的机制决定的.视图在数据库中保存为一条查询语句,仅仅为’select id from test01’,所以即使对表添加了字段也不会在先前建立的视图中得到体现.

例子3:重新添加视图的基表,并且保证新添加的基表与原基表不一致(视图查询的相关字段不一致)

SQL> drop table test01;

Table dropped

SQL> create table test01

2 (id date);

Table created

SQL> select * from VIEW_TEST01;

ID

-----------

SQL> desc VIEW_TEST01;

Name Type Nullable Default Comments

---- ---- -------- ------- --------

ID DATE Y

此时发现虽然视图可以查询,但是查询的结果已经发生了变化,原来查询的idvarhchar,而现在为date.这也是由于前面提到的数据库保存视图的机制决定的.

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

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8394333/viewspace-987138/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    56
  • 访问量
    759918