重新编译视图

        当表名、列名、列类型等底层表的信息发生改变的时候,就会使得视图无法使用,其时就需要对视图进行重新的编译。
 
第一步,查找失效的视图。

       可以使用数据字典中的user_objects来查找出失效的视图名,还可以利用user_views来查找出相应视图的代码信息。
基本的代码如下:

----------------查找出失效的视图  
Select object_name,      ---------对象名称  
      object_type,      ---------对象类型   
      status            ---------对象当前状态  
from user_objects        ---------用户对象表  
where object_type= ‘VIEW’    
           and status = ‘INVALID’;  
 
----------------利用上面找出的试图名称,查找出视图的代码  
Select VIEW_NAME,   --------视图名称  
      TEXT         --------视图的代码  
from user_views     --------用户视图表   
where  view_name=’view_name’   


 

第二步,重新编译。

       可以使用以下方式来重新编译视图:

        ALTER  VIEW view_name COMPILE;

        如果视图的结构被改变了(如底层表的列被删除了),则上面的这种方法无法对视图重新编译成功。为此,现在只能把视图删掉,然后重新建立视图。

 

---------建立表和视图  
create table table1  
(  
column1  integer,  
column2  integer  
);  
create view view1 (column3) as  
select column1 as column3 from table1;
 ---------查看修改前的状态
Select object_name,object_type,status   
from user_objects  
where object_type = 'VIEW' ;
and object_name='VIEW1';
 --------修改前的状态为可用
OBJECT_NAME     OBJECT_TYPE    STATUS
------------  ----------  -------------
       VIEW1          VIEW          VALID
----------------修改table1中column1
alter table table1  
modify column1 not null;
 ---------------再次查看修改后视图的状态,发现为“不可用”
Select object_name,object_type,status   
from user_objects  
where object_type = 'VIEW'  
and object_name='VIEW1';
---------------修改后的状态
OBJECT_NAME     OBJECT_TYPE    STATUS
-------------   ---------  -------------
       VIEW1          VIEW          INVALID
---------------对视图进行重新编译
ALTER VIEW view1 COMPILE;
---------------再次查看视图的状态,视图“可用”
Select object_name,object_type,status   
from user_objects  
where object_type = 'VIEW'  
and object_name='VIEW1';
OBJECT_NAME     OBJECT_TYPE    STATUS
-----------   ----------  -----------
       VIEW1          VIEW          VALID
 ---------------如果破坏视图的结构,比如说删除column1,则以上的修复方式无效
alter table table1       
 drop column column1;
 alter view view1 compile;
 --重新编译无效,视图的结构已经改变
--------------删除原来的视图
drop view view1;
 -------------查找出原来的视图语句,根据修改重新建立新的视图
Select VIEW_NAME,TEXT from user_views where  view_name='VIEW1';
 create view view1 as
  select column2  from table1;
 -------------查看视图的状态
Select object_name,object_type,status   
from user_objects  
where object_type = 'VIEW'  
and object_name='VIEW1'
OBJECT_NAME     OBJECT_TYPE    STATUS
------------   -----------  -------------
       VIEW1          VIEW          VALID
 

 

日常管理维护一个oracle数据库服务器的时,经常会碰到修改view,table结构的情况,而且由于oracle view,函数,存储过程等对象的相互关联的关系,经常会由于一个view,table,fun,proc的修改而导致相关的对象失效。而实施的时候,经常只会注意要修改的对象是否修改完成,往往忽略相关对象的失效问题,所以做了一个自动重新编译的脚本程序,目的是定期(10分钟)完成一次对所有对象的检查,如果有失效对象,则对其进行重新编译。 机制是:基于linux的crontab,定期执行下述脚本,对失效的对象,执行alter object_type object_name compile;语句,达到重新编译。 如果扩展该脚本,可以完成对失效的对象进行告警等管理的需要。 该脚本运行于oracle9i,linux 环境下面 #!/bin/sh nowdir=`pwd` #配置文件的生成日期 nowtime=`date '+%Y%m%d'` nowtime_h=`date '+%Y%m%d%H%M'` #脚本执行的目录 dmpdir=/oracle_script/auto_recompile #初始化参数 cd #执行oracle 相关的环境变量, . .bash_profile cd $dmpdir #下面取出失效的对象('TRIGGER','PROCEDURE','FUNCTION','VIEW), #并且去掉系统的对象,只针对用户自己部署的。 #如果有失效对象则完成alter sql语句。 rm -rf param.temp $ORACLE_HOME/bin/sqlplus -SILENT "/ as sysdba" <>$dmpdir/do.log dofilelog="obj_compile"$nowtime_h'.log' $ORACLE_HOME/bin/sqlplus -SILENT "/ as sysdba" <> $dofilelog echo "-------------- Complete export End on `date` -------------" >>$dmpdir/do.log
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值