下面是我用来分析数据库中dba_objects的无效dba对象及其返回无效对象的查询:
select do.STATUS as CODE_STATUS, do.OBJECT_TYPE, do.OWNER, do.OBJECT_NAME from dba_objects do
WHERE UPPER(do.OBJECT_TYPE) IN ('TABLE', 'VIEW', 'FUNCTION', 'PROCEDURE', 'PACKAGE', 'PACKAGE BODY') AND UPPER(do.STATUS) <> 'VALID'
AND do.owner in ('AD','BD','DR','CD')
以下是我用来分析sys.dba_objects中无效的dba对象及其返回null的查询:
select do.STATUS as CODE_STATUS, do.OBJECT_TYPE, do.OWNER, do.OBJECT_NAME from sys.dba_objects do
WHERE UPPER(do.OBJECT_TYPE) IN ('TABLE', 'VIEW', 'FUNCTION', 'PROCEDURE', 'PACKAGE', 'PACKAGE BODY') AND UPPER(do.STATUS) <> 'VALID'
AND do.owner in ('AD','BD','DR','CD')
为什么第一个查询返回包含无效包体的结果以及为什么第二个查询不返回任何结果
答案 0 :(得分:4)
名称解析规则are described in the documentation。
当您针对sys.dba_objects
运行查询时,您将直接访问名为dba_objects
的SYS拥有的视图。当您针对 unqualified dba_objects
运行查询时,您可以通过私有同义词(您拥有)访问您拥有的表或视图,或您或其他人拥有的对象或公共同义词。
通常只有dba_*
观看的公开同义词,这意味着如果您引用dba_objects
,那么您仍然通过该默认公共同义词实际查看sys.dba_objects
。
在您的情况下,两个用户具有相同名称的私人同义词。如果您以READ_ONLY
或RM2_READ_ONLY
连接,则会使用这些用户的私人同义词;因此,当您引用dba_objects
时,您实际上会查看o2support.rm_dba_objects
,根据您获得的结果,它与sys.dba_objects
的当前内容完全无关。
总结一下:你有一个私人同义词,它优先于公共同义词,而这两个语句查询不同的表。
我猜这是系统中对象的早期快照,可能是 - 从名称中 - 将被删除的对象,可能作为恢复它们的参考,如果需要的话。无论它是什么,它都是陈旧的,你似乎不想看到它的内容。
如果您想查看当前数据字典,则必须继续明确引用sys.dba_objects
,或查看是否可以安全删除私人同义词。
(它不是很有用,但你可以也明确地引用公共同义词;但是所有者必须作为带引号的标识符提供,即"PUBLIC".dba_objects
。没有任何好处这样做直接引用sys.dba_objects
。)