也许我一直都错了,但是:
最近我搬到了一个新项目,在这里我遇到了一个奇怪的场景 - 有一个包,我可以描述和查看包体和描述,但当我查询ALL_OBJECTS
视图时,我没有看包装。
一个简单的
select * from all_objects where object_name like '%PACKAGE_NAME%';
没有结果。
注意 - 程序包属于不同的架构。我可以访问“只读”#39;从我可以描述包的模式。
这怎么可能?不是ALL_OBJECTS
视图中可用的模式可见的所有对象吗?
答案 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
中。