【发布时间】:2022-06-28 02:31:15
【问题描述】:
我注意到,对于 SYS 架构中的某些对象,以下两列报告了不同的值:
例如:
select object_id
from all_objects
where object_name = 'DBMS_STATS'
and owner = 'SYS';
select distinct object_id
from all_procedures
where object_name = 'DBMS_STATS'
and owner = 'SYS';
select distinct object_id
from all_arguments
where package_name = 'DBMS_STATS'
and owner = 'SYS';
生产
OBJECT_ID
---------
14813
OBJECT_ID
---------
14812
OBJECT_ID
---------
14812
- 在 Oracle 21c 上
- 在 Oracle 18c 上
- 但不是在 Oracle 11g 上
好像ALL_OBJECTS中的数据有误?我在OBJECT_ID = 14813 中找不到ALL_PROCEDURES 的任何条目,相反,OBJECT_ID = 14812 在ALL_OBJECTS 中生成此对象:
select owner, object_name, object_type
from all_objects
where object_id = 14812;
结果:
|OWNER |OBJECT_NAME |OBJECT_TYPE|
|------|------------------|-----------|
|PUBLIC|XS$ROLE_GRANT_LIST|SYNONYM |
完全不相关。这是字典视图中的已知错误吗?还是我误解了 OBJECT_ID 的语义,我认为它是字典中唯一的对象标识符?
我正在使用 Oracle Database 21c Express Edition Release 21.0.0.0.0 - 从这里开始生产:https://hub.docker.com/r/gvenzl/oracle-xe,尽管我们的客户也可以在 19c Enterprise Edition 19.5.0.0.0 中复制它
【问题讨论】:
-
fwiw:我无法在我的非 XE 19c 安装中重现该行为。
-
@RenéNyffenegger:这就是我添加该版本的原因。当 gvenzl 删除一些对象以使 docker 图像更小时,可能是该特定构建中的错误。这或许可以解释为什么它可以在 dbfiddle 上复制,因为它可能也使用该图像。
-
看起来视图已被大幅改写。在 11g 中,它们都引用同一个基础表来获取
obj#;在 21c 中只有all_objects直接使用它;其他人使用int$dba_procedures和int$dba_arguments。当然,它们似乎仍然应该对齐,但想知道其中是否有问题。虽然在 dbfiddle 上看不到它们。 -
@RenéNyffenegger:我们的一个客户正在使用 19.c (19.15.0.0.0) 有相同的错误,所以它似乎与 XE 无关。
-
是的,我现在发现了一个 19.15.0.0.0 非 XE 安装,其中我有类似(尽管不完全相同)的现象。