对象在描述时可用但在all_objects中不可用

时间:2014-11-04 06:30:14

标签: sql oracle

也许我一直都错了,但是:

最近我搬到了一个新项目,在这里我遇到了一个奇怪的场景 - 有一个包,我可以描述和查看包体和描述,但当我查询ALL_OBJECTS视图时,我没有看包装。

一个简单的

select * from all_objects where object_name like '%PACKAGE_NAME%';

没有结果。

注意 - 程序包属于不同的架构。我可以访问“只读”#39;从我可以描述包的模式。

这怎么可能?不是ALL_OBJECTS视图中可用的模式可见的所有对象吗?

1 个答案:

答案 0 :(得分:0)

我的第一个想法是,这不是观点应该如何表现的。我能想到的唯一可能性是,某人在恶作剧或实验的精神下,在您的架构中创建了一个ALL_OBJECTS表或视图。让一个人的假设受到挑战总是很有趣,所以我对此进行了更多研究。我以SYS身份登录到我的数据库,并查看了ALL_OBJECTS和ALL_SOURCE视图的源代码。相关的片段在这里 - 我不认为我在这里复制它们会违反任何知识产权法律,但如果有必要会删除:

ALL_OBJECTS

select obj# from sys.objauth$
            where grantee# in (select kzsrorol from x$kzsro)
            and privilege# in (3 /* DELETE */,   6 /* INSERT */,
                               7 /* LOCK */,     9 /* SELECT */,
                               10 /* UPDATE */, 12 /* EXECUTE */,
                               11 /* USAGE */,  16 /* CREATE */,
                               17 /* READ */,   18 /* WRITE  */ )

ALL_SOURCE

          o.type# = 11 and
          (
            privilege# = -141 /* CREATE ANY PROCEDURE */
            or
            privilege# = -241 /* DEBUG ANY PROCEDURE */
          )

还有:

      (o.type# in (11 /* package body */, 14 /* type body */))
      and
      exists
      (
       select null from sys."_ACTUAL_EDITION_OBJ" specobj, sys.dependency$ dep, sys.objauth$ oa
        where specobj.owner# = o.owner#
          and specobj.name = o.name
          and specobj.type# = decode(o.type#,
                                     11 /* pkg body */, 9 /* pkg */,
                                     14 /* type body */, 13 /* type */,
                                     null)
          and dep.d_obj# = o.obj# and dep.p_obj# = specobj.obj#
          and oa.obj# = specobj.obj#
          and oa.grantee# in (select kzsrorol from x$kzsro)
          and oa.privilege# = 26 /* DEBUG */)

我不是DBA,我有点不能深入解释这一点,但我猜你的架构有CREATE ANY PROCEDURE,但没有特定于包的特权?如果是这种情况,则可以解释为什么您可以在ALL_SOURCE中看到来源,但该包不会出现在ALL_OBJECTS中。