我正在读这篇文章: Managing Oracle Synonyms
关于偏好的顺序,当它将对象名称解析为实际对象时,它说:
将始终首先访问本地对象。
如果本地对象不存在,将访问具有私有同义词的对象。
如果私有同义词不存在或该对象不存在,则将使用公共同义词。
我想知道这个顺序中的公共对象是否以某种方式丢失了?
E.g。如果用户BOB查询
select * from FOOBAR
并且dba_tables / views中没有BOB.FOOBAR,但是PUBLIC.FOOBAR。
Oracle是否将其解析为PUBLIC.FOOBAR,还是先检查同义词?
谢谢。
答案 0 :(得分: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
答案 1 :(得分:3)
PUBLIC至少不超过10g,不是真正的用户。您无法在“公共架构”中创建对象:
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“架构”中回答有关预定义表格/视图的问题。