oracle中同义词的区别

Difference between Synonyms in oracle

下面是我用来分析数据库中 dba_objects 的无效 dba 对象及其 return 与无效对象的查询:

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 及其 returning null 的无效 dba 对象的查询:

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')

为什么第一个查询 returns 结果包含无效的包体,为什么第二个查询 return 没有任何结果

名称解析规则are described in the documentation

当您 运行 查询 sys.dba_objects 时,您正在直接访问名为 dba_objects 的 SYS 拥有的视图。当您 运行 您对 不合格 dba_objects 的查询时,您可以访问您拥有的 table 或视图,或者您或其他人的对象通过私人同义词(您拥有)或 public 同义词拥有。

通常 dba_* 视图只有一个 public 同义词,这意味着如果您引用 dba_objects 那么您实际上仍在查看 sys.dba_objects,通过默认 public 同义词。

在你的例子中,两个用户拥有同名的私有同义词。如果您以 READ_ONLYRM2_READ_ONLY 的身份连接,则将使用这些用户的私有同义词;因此,当您引用 dba_objects 时,您实际上会查看 o2support.rm_dba_objects,根据您获得的结果,它与 sys.dba_objects.[=25= 的当前内容完全无关]

总结一下:你有一个私有同义词,它优先于 public 同义词,并且这两个语句查询不同tables.

我猜这是系统中对象的早期快照,可能是 - 从名称来看 - 将要删除的对象,可能作为在需要时恢复它们的参考。不管它是什么,它都是陈旧的,你似乎不想看到它的内容。

如果要查看当前数据字典,则必须继续显式引用sys.dba_objects,或者查看是否可以安全删除私有同义词。

(不是很有用,但你 可以 也明确引用 public 同义词;但所有者必须作为带引号的标识符提供,即 "PUBLIC".dba_objects。虽然这样做比直接引用 sys.dba_objects 没有任何好处。)