ORA-01775: 同义词的循环链

昨天在qq群里看到有人在问同义词的循环链的问题,一时感兴趣,就分析了下。

顾名思义,就是同义词A指向同义词B,而同义词B又指向同义词A,导致死循环。

(1)下面先看一下如何导致同义词的循环链。

以scott用户登录测试库,依次执行下面的代码:

create table t1 (id number,name varchar2(32));
create table t2 (id number,name varchar2(32));
insert into t1 values (1,'t1');
insert into t2 values (2,'t2');
commit;
create public synonym t1 for t2;
create public synonym t2 for t1;
drop table t1;
drop table t2;

--执行下面的语句就会报错:同义词的循环链

SQL> select * from t1;
select * from t1
ORA-01775: 同义词的循环链

SQL> select * from t2;
select * from t2
ORA-01775: 同义词的循环链

SQL>

(2)分析如何导致上面的错误

首先要知道oracle查找一个对象的步骤:

1、先在自己的对象(user_objects)中查找,若找到,则使用该对象

2、若找不到,则在用户的私有同义词中查找该对象,若找到,则使用该对象

3、若找不到,则在公共同义词里找,若找到,则使用该同义词,若找不到,则报错。

上面的select * from t1会导致oracle在user_objects里查找object_name=t1的对象,发现找不到,接着,oracle会在user_synonyms里查询synonym_name=t1的私有同义词,发现找不到, oracle会接着在dba_synonyms里查找owner=public and SYNONYM_NAME=t1的同义词,发现找到了,然后oracle将上面的sql语句转换为:select * from scott.t2 。然后oracle跑到scott方案里查找object_name=t2

的对象,发现没有,接着,oracle会在user_synonyms里查询synonym_name=t2的私有同义词,发现找不到,接着,oracle又到public synonyms里查找synonym_name=t2的同义词,发现找到了,然后oracle将上面的sql语句转换为:select * from scott.t1。

。。。。。。就这样,无限死循环了,所以oracle报错:同义词的循环链。

同理,下面的select * from t2;原理也是一样的。

 

 

 

你可能感兴趣的:(oracle)