首页 > Linux操作系统 > Linux操作系统 > 对象、同义词和公有同义词顺序选取
笔者开发的项目中,广泛使用公有同义词技术。通过公有同义词,消除不同数据源对象之间访问的差异,做到数据逻辑和物理上的分布。
突然想到一个问题:在一个schema下,如果存在自身对象、私有同义词和公有同义词相同,那么在访问的时候,Oracle会如何选择呢?
一个简单的实验,可以告诉我们答案。
构建实验环境
思路是在一个用户下建立三个数据表test、test1、test2。为test1创建私有同义词private synonym,名称为test。为test2创建公有同义词public synonym,名称为test。
SQL> conn scott/tiger@orcl;
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as scott
//test建立
SQL> create table test
2 ( dest varchar2(20));
Table created
SQL> insert into test values ('I''m test table !');
1 row inserted
SQL> commit;
Commit complete
//test2建立
SQL> create table test2 (dest varchar2(20));
Table created
SQL> insert into test2 values ('I''m test2 table !');
1 row inserted
SQL> commit;
Commit complete
//test3建立
SQL> create table test3 (dest varchar2(20));
Table created
SQL> insert into test3 values ('I''m test3 table !');
1 row inserted
SQL> commit;
Commit complete
建立私有和公有同义词。
SQL> create synonym test for scott.test2;
create synonym test for scott.test2
ORA-00955: 名称已由现有对象使用 //报错,作为scott用户私有对象,看来不允许是同名出现!!!
//公有同义词就可以了!
SQL> create public synonym test for scott.test2;
Synonym created
从这里,我们已经可以获得一个知识。Oracle是不允许一个owner下面存在相同名称数据表,但是公共同义词同名是允许的。那么,在自身对象和公共同义词上,Oracle如何选取呢?
优先级选择实验A
//发出查询语句
SQL> select * from test;
DEST
--------------------
I'm test table ! //访问的是scott自身下面的数据表test
SQL> select * from public.test; //公共同义词基本不能访问到。
select * from public.test
ORA-00903: 表名无效
//如果切换了用户,我们实验一下。
SQL> conn sys/Conan2002@orcl as sysdba;
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as SYS
SQL> select * from test; //公共同义词起效果。
DEST
--------------------
I'm test2 table !
结论:在schema里,当面临着自身私有对象和公共同义词对象的时候,Oracle会优先选择私有对象作为目标。
如果我们删除了私有对象呢?继续实验。
SQL> drop table test;
Table dropped //删除了对象!
SQL> select * from test;
DEST
--------------------
I'm test2 table ! //删除了对象,公共同义词起效果了。
结论:当存在同名对象的时候,只有在私有对象被去除之后,才可能有访问到公共同义词的机会。
继续思考,那么私有同义词和公共同义词之间同名发生时,Oracle做什么样的选择呢?
优先级选择实验B
数据表test已经被删除,设置test3表为scott用户的私有同义词。
SQL> create synonym test for scott.test3; //创建私有同义词
Synonym created
//优先选择私有同义词对象。
SQL> select * from test;
DEST
--------------------
I'm test3 table !
结论显而易见:在有私有同义词和公有同义词的相同的情况下,Oracle优先选择私有同义词对象。当然,如果删除了私有同义词,公有同义词也就开始起效果了。
SQL> drop synonym test;
Synonym dropped
SQL> select * from test;
DEST
--------------------
I'm test2 table !
一个简单的问题,告诉我们Oracle一个选择的原则:在选择对象的时候,范围是从小而大,可能范围越小,Oracle认为Schema的可控能力就越强吧。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/17203031/viewspace-687732/ ,如需转载,请注明出处,否则将追究法律责任。