以前写过一则 Blog , 如何重编译无效的数据库对象. 可是有的时候,因为一些原因,在对一些数据库的 Package 对象的权限做修改之后, 会出现大量的无效对象, 即使反复编译,也是无济于事的.
今天就遇到过一起.
ops$oracle@demo>select object_name,owner,object_type from dba_objects where status='INVALID';
OBJECT_NAME OWNER OBJECT_TYPE ---------------------------- -------------------------- ------------------ DRIDDLR CTXSYS PACKAGE BODY
ops$oracle@demo>alter package ctxsys.DRIDDLR compile body;
Warning: Package Body altered with compilation errors. ops$oracle@demo>execute utl_recomp.recomp_serial('CTXSYS'); PL/SQL procedure successfully completed.
ops$oracle@APAYCA>select object_name,owner,object_type
from dba_objects where status='INVALID';
OBJECT_NAME OWNER OBJECT_TYPE ---------------------------- -------------------------- ------------------ DRIDDLR CTXSYS PACKAGE BODY
因为刚刚撤销了 Public 对 DBMS_METADATA 和 DBMS_JOB 的执行权限. 本着最小权限授予原则,所以决定尝试恢复 CTXSYS 对两个包的执行权限.经过测试,
SQL> grant execute on DBMS_JOB to ctxsys;
然后重新编译,成功.
这是一个个例.但是也有普遍性. 在 Oracle 概念手册中”Dependencies Among Schema Objects” 一章中,介绍了数据对象间的依赖关系和无效对象的解决指导.但是并没有提关于权限而导致无效对象的问题.
我的下一个问题是如何能更有效找到数据对象之间的依赖关系. 这样再遇到类似的情况就不用逐个的去尝试了.
BTW:
好久没写”DBA备忘录”系列的东西了.这个小文算是添加一篇.