管理Oracle同义词

Wil*_*ill 7 oracle schema object synonym

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

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

  1. 始终首先访问本地对象.

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

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

我想知道这个顺序中的公共对象是否以某种方式丢失了?

例如,如果用户BOB查询

select * from FOOBAR
Run Code Online (Sandbox Code Playgroud)

并且在dba_tables/views中没有BOB.FOOBAR但是PUBLIC.FOOBAR.

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

谢谢.

Jus*_*ave 10

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

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

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

Synonym created.
Run Code Online (Sandbox Code Playgroud)

该同义词的所有者最终成为了 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
Run Code Online (Sandbox Code Playgroud)

此外,第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
Run Code Online (Sandbox Code Playgroud)


DCo*_*kie 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> 
Run Code Online (Sandbox Code Playgroud)

如果您运行此查询:

SELECT object_name 
  FROM dba_objects 
 WHERE owner='PUBLIC' 
   AND object_type IN ('TABLE', 'VIEW');
Run Code Online (Sandbox Code Playgroud)

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