ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 对象、同义词和公有同义词顺序选取

对象、同义词和公有同义词顺序选取

原创 Linux操作系统 作者:realkid4 时间:2011-02-22 20:46:34 0 删除 编辑

 

笔者开发的项目中,广泛使用公有同义词技术。通过公有同义词,消除不同数据源对象之间访问的差异,做到数据逻辑和物理上的分布。

 

突然想到一个问题:在一个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博客 ” ,链接:http://blog.itpub.net/17203031/viewspace-687732/,如需转载,请注明出处,否则将追究法律责任。

下一篇: 自定义PL/SQL异常
请登录后发表评论 登录
全部评论
求道~

注册时间:2010-11-30

  • 博文量
    545
  • 访问量
    7746624