同义词Synonym的一个小实验

本文通过实验探讨Oracle数据库中同义词映射机制,验证同义词映射是基于对象名称而非内部ID,并通过重建同名不同内容的对象来进一步验证这一结论。

 

今天看到secooler的一篇关于同义词的文章(http://space.itpub.net/519536/viewspace-687959),觉得很有意思。于是想做一些延展性的测试。

 

 

secooler的文章是从同义词相关的错误ORA-00980进行分析的。简单的说:同义词起到一个映射作用,将一个对象名取定了别名。这种映射关系并不是一种数据库强制约束。映射关系只有在使用同义词的时候才会进行检查,如果没有找到映射对象,Oracle就会报错ORA-00980。

 

 

那么,笔者在思考一个问题:同义词在进行中映射的过程中,是完全根据被命名对象的显示名称(scott.emp)还是根据Oracle内部为每个对象分配的id呢?

 

我们进行下面的实验:

 

SQL> conn scott/tiger@orcl;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as scott

 

SQL> create table test as select * from all_objects;

 

Table created

//对象test的object_id为53728

SQL> select object_id from user_objects where object_name='TEST';

 

 OBJECT_ID

----------

     53728

 

SQL>

 

 

此时,我们进行同义词创建,当然是到另一个schema上面去。

 

 

SQL> conn / as sysdba;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as SYS

 

SQL> select count(*) from scott.test;

 

  COUNT(*)

----------

     40727

 

SQL> create synonym scotttest for scott.test; //创建了同义词!

 

Synonym created

 

SQL> select count(*) from scotttest;

 

  COUNT(*)

----------

     40727

 

 

环境基本具备了,我们建立了同义词scotttest。sys用户在访问scotttest的时候,就会映射为名称scott.test。

 

首先,如果我们删除scott.test,看看现象。

 

SQL> conn scott/tiger@orcl;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as scott

 

SQL> drop table test;

 

Table dropped  //没有任何疑惑的删掉了。

 

SQL> select * from test;

 

select * from test

 

ORA-00942: 表或视图不存在

 

SQL>

 

 

回到同义词上,我们观察。

 

SQL> conn / as sysdba;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as SYS

 

SQL> show user;

User is "SYS"

 

SQL> select * from scotttest;

 

select * from scotttest

 

ORA-00980: 同义词转换不再有效 //出现secooler所介绍的问题!

 

 

说明:同义词只有在使用的时候,才会进行验证是否映射正确。

 

 

那么,我们回到scott上,伪造一个test数据表。

 

 

SQL> conn scott/tiger@orcl;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as scott

 

SQL> create table test as select * from emp;

 

Table created

 

SQL> select object_id from user_objects where object_name='TEST';

 

 OBJECT_ID

----------

53730

 

 

 

注意:我们虽然重新建立了数据表对象test,内容不一样。Oracle自动分配的对象object_id也是不同的(原来为:53728,现在为53730)。回到sys下面,看看那个旧的同义词是否还有效。

 

SQL> conn / as sysdba;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as SYS

 

SQL> select count(*) from scott.emp;

 

  COUNT(*)

----------

        14

 

SQL> select count(*) from scotttest;

 

  COUNT(*)

----------

        14

 

 

看来,我们猜想Oracle使用映射时,使用object_id进行匹配还是错误的。Oracle把问题处理的很简单,就是按照对象的名称进行寻找。有这个名字的对象,就算映射成功,否则失败。

 

 

 

看来还是笔者想的太多了

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17203031/viewspace-687970/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/17203031/viewspace-687970/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值