重庆思庄Oracle、Redhat认证学习论坛

标题: 编译失效对象的三种方法 [打印本页]

作者: 刘泽宇    时间: 2020-9-20 12:25
标题: 编译失效对象的三种方法
导致数据库中对象失效的原因有几种:1.当被引用对象的结构变更时,都会使得相关的依赖对象转变为INVALID状态
2.发布SQL脚本时(包、存储过程、函数等),没有充分测试,编译时出错,这时对象变为无效
3.数据库升级、迁移时,出现大量无效对象(本质原因应该是属于1)
4.诸如此类各种情况:例如,Oracle 会自动维护分区索引,对于全局索引,如果在对分区表操作时,没有指定update index,则会导致全局索引失效,需要重建
在遇到对象失效的情况下,就需要对这些对象进行重新编译:
查看失效对象
SQL>  select owner,object_name,object_type, status, count(*) from dba_objects where status='INVALID'
          group by owner, object_name,object_type, status
          order by owner, object_name,object_type;
重新编译失效对象有以下几种方法:
1.使用数据库带有的脚本进行编译
SQL>@$ORACLE_HOME/rdbms/admin/utlrp.sql
此脚本需要SQLPLUS以SYSDBA身份运行,并且当时数据库中最好不要有活动事物或DDL操作,否则极容易导致死锁的出现

2.使用ALTER *** COMPLIE语句手工进行编译,这个方法可以用于少数、个别对象失效
alter package <schema name>.<package_name> compile;
alter package <schema name>.<package_name> compile body;
alter view <shema name>.<view_name> compile;
alter trigger <schema>.<trigger_name> compile;
如:
SQL> select 'alter' ||' '||object_type || ' ' || owner || '.' ||object_name ||' ' || 'compile;'
  2  from dba_objects where status='INVALID' and object_type='PACKAGE';
'ALTER'||''||OBJECT_TYPE||''||OWNER||'.'||OBJECT_NAME||''||'COMPILE;'
---------------------------------------------------------------------------------------------------
alter PACKAGE APEX_030200.WWV_FLOW_UTILITIES compile;
alter PACKAGE APEX_030200.WWV_FLOW_LOAD_DATA compile;

3.ORACLE提供了自动编译的接口dbms_utility.compile_schema(user,false); 调用这个过程就会编译所有失效的过程、函数、触发器、包
exec dbms_utility.compile_schema( 'SCOTT' )











欢迎光临 重庆思庄Oracle、Redhat认证学习论坛 (http://bbs.cqsztech.com/) Powered by Discuz! X3.2