7

我正在阅读这篇文章: 管理 Oracle 同义词

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

  1. 本地对象总是首先被访问。

  2. 如果本地对象不存在,则将访问具有私有同义词的对象。

  3. 如果私有同义词不存在或对象不存在,则将使用公共同义词。

我想知道公共对象是否以某种方式按此顺序丢失?

例如,如果用户 BOB 查询

select * from FOOBAR

dba_tables/views 中没有 BOB.FOOBAR,但 PUBLIC.FOOBAR。

Oracle 会将其解析为 PUBLIC.FOOBAR 还是会先检查同义词?

谢谢你。

4

2 回答 2

10

在您的示例中,FOOBAR几乎可以肯定是公共同义词。没有PUBLIC架构,但PUBLIC被列为公共同义词的所有者。

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

SQL> create public synonym pub_syn_emp
  2     for scott.emp;

Synonym created.

该同义词的所有者最终成为PUBLIC

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 尝试将私有同义词解析为实际对象时,您只会得到一个错误。

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
于 2011-07-13T14:36:35.637 回答
3

至少到10g,PUBLIC不是真正的用户。您不能在“公共架构”中创建对象:

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> 

如果您运行此查询:

SELECT object_name 
  FROM dba_objects 
 WHERE owner='PUBLIC' 
   AND object_type IN ('TABLE', 'VIEW');

您可以在 PUBLIC “架构”中回答有关预定义表/视图的问题。

于 2011-07-13T14:39:10.840 回答