今天看到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/
本文通过实验探讨Oracle数据库中同义词映射机制,验证同义词映射是基于对象名称而非内部ID,并通过重建同名不同内容的对象来进一步验证这一结论。

3476

被折叠的 条评论
为什么被折叠?



