database - oracle中同义词的区别

标签 database oracle object database-administration sys

下面是我用来分析数据库中 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_ONLYRM2_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/

相关文章:

arrays - 如何使用存储在自定义聚合物 2.0 元素属性中的对象

javascript - 将数组插入 JSON 对象、Javascript

database - 在 Web 应用程序中的何处存储数据库凭据?

从 Doctrine 中的新 YAML 迁移数据库

database - 为什么要使用单例来管理数据库连接?

sql - 如何清除 Oracle 中的所有缓存项

sql - 获取 SQL XML 标记以显示 NULL 值

oracle - PL/SQL 过程的同步。如何保证一次只执行一个程序?

java - 在另一个函数中声明的 Canvas 上绘图

c# - 带有绑定(bind)变量的 OleDbCommand