管理Oracle同义词

7
我正在阅读这篇文章:管理Oracle Synonyms 关于解析对象名称到实际对象的优先顺序,它说:
  1. 始终首先访问本地对象。

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

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

我在想,这个顺序中是否遗漏了公共对象?
例如,如果用户BOB查询...
select * from FOOBAR

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

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

谢谢。

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

此外,第三项似乎不正确。如果存在一个指向不存在对象的私有同义词和一个指向有效对象的公共同义词,则私有同义词仍然优先。当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

哦,所以只有同义词可以拥有PUBLIC作为所有者吗?由于似乎无法创建任何具有公共所有者的表/视图,我的问题是是否有任何预定义的表或视图具有PUBLIC作为所有者。 - Will
1
@Will - 没有预定义的表或视图属于伪模式“PUBLIC”。有一个伪角色“PUBLIC”,隐式授予所有用户一些特权,主要是授予各种预定义包的执行访问权限给所有用户。 - Justin Cave

3

至少在10g版本中,PUBLIC不是一个真正的用户。您无法在“Public schema”中创建对象:

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');

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

好的,你可以创建公共同义词,它们也是对象。我感兴趣的是: 1)您可以在公共模式中创建表/视图吗? 2)公共架构中是否有任何预定义的表/视图? - Will
这就是我上面展示的内容。你不能在公共“schema”中创建表。 - DCookie
请查看我的更新答案,其中我解答了预定义的问题。 - DCookie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接