ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 同义词Synonym的一个小实验

同义词Synonym的一个小实验

原创 Linux操作系统 作者:realkid4 时间:2011-02-25 21:11:40 0 删除 编辑

 

今天看到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/,如需转载,请注明出处,否则将追究法律责任。

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

注册时间:2010-11-30

  • 博文量
    545
  • 访问量
    7745722