2017-05-26 122 views
0

执行没有模式限定符的地址对象的语句时,Oracle将首先在本地模式中查找对象,并且只有在找不到公共同义词的对象时才会找到该对象。Oracle:私有和公共同义词

比如我创建了两个(02)同义词:

create public synonym emp for oe.employees; 
create synonym emp for hr.employees; 

我喜欢登录人力资源和我执行下面的语句。

select * from emp; 

如何引用公有同义词,如果它具有相同的名称,如私人同义词?

回答

1

不,Oracle将在对象解析期间查找公共同义词之前选择本地同义词。您不能将对象范围略过,只能解析为公共同义词。

Object resolution docs

+0

好但在我的情况下,我想指的是公共同义词。我该怎么做。 – Steve

+0

@Steve你不能 – miracle173

+0

@Steve:但加里·迈尔斯说,你可以:https://stackoverflow.com/a/44233916/754550 – miracle173

0

我们不能引用的代名词明确。 Oracle根据名称解析规则的固定范围解释emp

所以,你有两个选择:

  1. 硬代码的架构名称:

    Select * from oe.employees;

  2. 再创建一个私有同义词:

    Create synonym not_my_emp for oe.employees;

这些都不是理想的,但问题的原因是最初的决定是拥有一个覆盖公有同义词的私有同义词。

0

尝试

select * from "PUBLIC".EMP 

同义词的所有者是公开的,但是这是在各种情况下的保留字。双引号是一种解决方法。

+0

你试过这个吗? – miracle173

+0

它在12.1环境中工作。不了解旧版本或12c容器/可插入环境。 –

+0

我试过了,并且获得了以下消息: desc“PUBLIC”.EMP 错误: ORA-04043:对象“OE”。“ORDERS”不存在 – Steve