下面是我用来分析数据库中 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')
为什么第一个查询返回的结果包体无效,为什么第二个查询不返回任何结果
最佳答案
名称解析规则are described in the documentation .
当您对 sys.dba_objects
运行查询时,您将直接访问名为 dba_objects
的 SYS 拥有的 View 。当您针对不合格 dba_objects
运行查询时,您可以通过私有(private)同义词(即您拥有)或公共(public)同义词。
通常 dba_*
View 只有一个公共(public)同义词,这意味着如果您引用 dba_objects
,那么您实际上仍在查看 sys。 dba_objects
,通过默认的公共(public)同义词。
在您的情况下,两个用户拥有同名的私有(private)同义词。如果您以 READ_ONLY
或 RM2_READ_ONLY
连接,那么将使用这些用户的私有(private)同义词;因此,当您引用 dba_objects
时,您实际上会查看 o2support.rm_dba_objects
,根据您获得的结果,它与 的当前内容完全无关>sys.dba_objects
.
总结一下:您有一个私有(private)同义词,它优先于公共(public)同义词,并且这两个语句查询不同的表。
我猜这是系统中对象的早期快照,可能是 - 从名称来看 - 将要删除的对象,可能作为在需要时恢复它们的引用。不管它是什么,它都是陈旧的,您似乎不想看到它的内容。
如果要查看当前数据字典,则必须继续显式引用 sys.dba_objects
,或者查看是否可以安全地删除私有(private)同义词。
(这不是很有用,但您可以也明确引用公共(public)同义词;但所有者必须作为带引号的标识符提供,即 "PUBLIC".dba_objects
。尽管这样做比直接引用 sys.dba_objects
没有任何好处。)
关于database - oracle中同义词的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36642537/