首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >管理Oracle同义词

管理Oracle同义词
EN

Stack Overflow用户
提问于 2011-07-13 14:07:31
回答 2查看 1.9K关注 0票数 7

我读了这篇文章:管理Oracle同义词

关于优先顺序,当涉及到将对象名称解析为实际对象时,它说:

  1. 将始终首先访问本地对象。
  2. 如果不存在本地对象,则将访问具有私有同义词的对象。
  3. 如果私有同义词不存在或对象不存在,则将使用公共同义词。

我在想这些公共物品是不是在这个顺序里不见了?

例如,如果用户BOB查询

代码语言:javascript
复制
select * from FOOBAR

在dba_table/视图中没有BOB.FOOBAR,只有PUBLIC.FOOBAR。

甲骨文是将其解析为PUBLIC.FOOBAR,还是会首先检查同义词?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-13 14:39:10

至少达到10g,公众并不是真正的用户。您不能在“公共模式”中创建对象:

代码语言:javascript
复制
SQL> CREATE TABLE public.foobar (id integer);

CREATE TABLE public.foobar (id integer)

ORA-00903: invalid table name

SQL> CREATE TABLE system.foobar (id integer);

Table created

SQL> 

如果您运行此查询:

代码语言:javascript
复制
SELECT object_name 
  FROM dba_objects 
 WHERE owner='PUBLIC' 
   AND object_type IN ('TABLE', 'VIEW');

您可以在公共“模式”中回答有关预定义表/视图的问题。

票数 3
EN

Stack Overflow用户

发布于 2011-07-13 14:36:35

在您的示例中,FOOBAR几乎肯定是一个公共同义词。没有PUBLIC模式,但是PUBLIC被列为公共同义词的所有者。

如果我创建一个新的公共同义词

代码语言:javascript
复制
SQL> create public synonym pub_syn_emp
  2     for scott.emp;

Synonym created.

同义词的所有者最终是PUBLIC

代码语言:javascript
复制
SQL> ed
Wrote file afiedt.buf

  1  select object_name, owner, object_type
  2    from dba_objects
  3*  where object_name = 'PUB_SYN_EMP'
SQL> /

OBJECT_NAME          OWNER      OBJECT_TYP
-------------------- ---------- ----------
PUB_SYN_EMP          PUBLIC     SYNONYM

此外,第3项似乎不正确。如果存在指向不存在的对象的私有同义词和指向有效对象的公共同义词,则私有同义词仍然优先。当Oracle试图将私有同义词解析为实际对象时,您只会得到一个错误。

代码语言:javascript
复制
SQL> create synonym syn_emp for scott.no_such_table;

Synonym created.

SQL> create public synonym syn_emp for scott.emp;

Synonym created.

SQL> select * from syn_emp;
select * from syn_emp
              *
ERROR at line 1:
ORA-00980: synonym translation is no longer valid
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6680228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档