【问题标题】:Oracle: private et public synonymsOracle:私有和公共的同义词
【发布时间】:2017-05-29 10:33:58
【问题描述】:

当执行不带模式限定符来寻址对象的语句时,Oracle 将首先在本地模式中查找对象,只有在找不到时才会查找公共同义词。

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

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

我像 HR 一样登录,我执行了以下语句。

select * from emp; 

如果公共同义词与私有同义词同名,如何引用它?

【问题讨论】:

    标签: oracle


    【解决方案1】:

    不,Oracle 将在对象解析期间查看公共同义词之前选择本地同义词。您不能将对象范围限定为跳过此操作,而只能解析为公共同义词。

    Object resolution docs

    【讨论】:

    • 好的,但就我而言,我想参考公共同义词。我该怎么做。
    • @Steve 你不能
    • @Steve:但是 Gary Myers 说,你可以:stackoverflow.com/a/44233916/754550
    • @Gary Myers 提供了一种解决方法,但如果您无权修改包含引用的代码,那么您就不走运了。
    【解决方案2】:

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

    所以你有两个选择:

    1. 硬编码模式名称:

      Select * from oe.employees;

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

      Create synonym not_my_emp for oe.employees;

    这两种方法都不理想,但问题的原因是最初决定使用私有同义词来覆盖公共同义词。

    【讨论】:

      【解决方案3】:

      试试

      select * from "PUBLIC".EMP
      

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

      【讨论】:

      • 你试过了吗?
      • 它在 12.1 环境中工作。不知道旧版本或 12c 容器/可插拔环境。
      • 我试了一下,得到了这个消息:desc "PUBLIC".EMP ERROR: ORA-04043: object "OE"."ORDERS" does not exist
      • 在 Oracle 数据库 SQL 语言参考中说:“注意不要创建与现有模式同名的公共同义词。如果这样做,那么所有 PL/SQL 单元使用该名称将失效。”
      猜你喜欢
      • 2014-08-21
      • 1970-01-01
      • 2011-05-31
      • 1970-01-01
      • 2011-06-21
      • 1970-01-01
      • 2015-12-27
      • 2011-03-11
      • 2011-07-29
      相关资源
      最近更新 更多