ORA-01775:同义词的循环链怎么解决?

如题所述

之所以会出现“ORA-01775:同义词的循环链”,是因为存在同义词,而同义词又缺少与之相应的对象。

1,首先应当查找是否存在循环的同义词。

2,如没有记录,则继续查找同义词没有对象的数据库对象。

3,对查询结果进行查询表操作,把该缺少对象的同义词删除,则可解决ORA-01775的错误。

扩展资料

数据库同义词的两种类型:“私有”和“公共”。其中的公共同义词能够由通过blic指定的模式来访问,所有数据库模式,即用户,皆可对它进行访问,而私有同义词仅能在指定的模式中被创建,并且只能在创建者使用的模式下被访问。

同义词的扩展方法:同一概念的同义词,其扩展方法有学名或俗名、简称和全称、术语和代码,等等。

同义词的作用:在Oracle中的同义词,可以用于在多人协作时屏蔽对象的名字及其持有者,并为用户简化sql语句,还能为分布式数据库的远程对象提供位置透明性。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2021-04-15
1、当用程序连接或者用plsql查询同义词时,如果出现ora-01775:同义词的循环链这样的问题。一般是因为存在同义词,但同义词没有相应的对象。

2、先查有没有循环的同义词。select*
fromdba_synonymswheretable_owner='TEST'andsynonym_name<>table_name;没有记录。

3、再查同义词没有对象的数据库对象select*
fromdba_synonymswheretable_owner='TEST'andsynonym_namein(selecta.synonym_namefromdba_synonymsawherea.table_owner='TEST'minusselectobject_namefromuser_objects)4、把查询出来的结果进行查询表select*fromDRILL_PRESON如果该同义词没有相应的对象,则会包ora-01775的错误5、把这个同义词删除droppublicsynonymDRILL_PRESON

分析如何导致上面的错误

首先要知道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;原理也是一样的
第2个回答  2021-05-30
ORA-01775:同义词的循环链怎么解决?之所以会出现“ORA-01775:同义词的循环链”,是因为存在同义词,而同义词又缺少与之相应的对象。
1,首先应当查找是否存在循环的同义词。
2,如没有记录,则继续查找同义词没有对象的数据库对象。
3,对查询结果进行查询表操作,把该缺少对象的同义词删除,则可解决ORA-01775的错误。
扩展资料:
数据库同义词的两种类型:“私有”和“公共”。其中的公共同义词能够由通过blic指定的模式来访问,所有数据库模式,即用户,皆可对它进行访问,而私有同义词仅能在指定的模式中被创建,并且只能在创建者使用的模式下被访问。
同义词的扩展方法:同一概念的同义词,其扩展方法有学名或俗名、简称和全称、术语和代码,等等。
同义词的作用:在Oracle中的同义词,可以用于在多人协作时屏蔽对象的名字及其持有者,并为用户简化sql语句,还能为分布式数据库的远程对象提供位置透明性。本回答被网友采纳
第3个回答  推荐于2017-06-03
1、 当用程序连接或者用plsql查询同义词时,如果出现ora-01775:同义词的循环链这样的问题。
一般是因为存在同义词,但同义词没有相应的对象。

2、 先查有没有循环的同义词。
select * from dba_synonyms
where table_owner='TEST'
and synonym_name<>table_name;

没有记录。

3、 再查同义词没有对象的数据库对象
select * from dba_synonyms
where table_owner='TEST'
and
synonym_name in
(select a.synonym_name from dba_synonyms a where a.table_owner='TEST'
minus
select object_name from user_objects)

4、 把查询出来的结果进行查询表
select * from DRILL_PRESON
如果该同义词没有相应的对象,则会包ora-01775的错误

5、 把这个同义词删除
drop public synonym DRILL_PRESON本回答被网友采纳
相似回答