Tag Archives: 编译无效对象

Revoke 权限后出现的无效对象该如何编译

以前写过一则 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; 

然后重新编译,成功.

继续阅读