如何debuggingORA-01775:同义词的循环链?

我很熟悉ORA-01775背后的问题:循环链同义词,但有没有什么窍门来debugging,或者我只需要“创build或replace”我的出路呢?

有没有一种方法来查询架构或什么来找出当前的公共同义词的定义是什么?

更棒的将是一个graphics工具,但在这一点上,任何事情都会有所帮助。

事实certificate,问题实际上并不是同义词的循环链,而是同义词指向一个不存在的观点。

在这种情况下,Oracle显然错误地认为是一个循环链。

如果您正在使用TOAD,请转到查看> Toad选项> Oracle>常规,并从EXPLAIN PLAN部分删除TOAD_PLAN_TABLE并将PLAN_TABLE

数据字典表DBA_SYNONYMS具有关于数据库中所有同义词的信息。 所以你可以运行查询

 SELECT table_owner, table_name, db_link FROM dba_synonyms WHERE owner = 'PUBLIC' AND synonym_name = <<synonym name>> 

看看公众同义词目前指的是什么。

今天,我得到了这个错误,debugging后,我发现实际的表是错误的,我使用的是同义词。 所以我build议 – 首先检查表是否存在! :-))

尝试这个select来find有问题的同义词,它列出了所有指向不存在的对象(表,视图,序列,包,过程,函数)的同义词。

 SELECT * FROM dba_synonyms WHERE table_owner = 'SYSADM' AND ( NOT EXISTS ( SELECT * FROM dba_tables WHERE dba_synonyms.table_name = dba_tables.TABLE_NAME ) AND NOT EXISTS ( SELECT * FROM dba_views WHERE dba_synonyms.table_name = dba_views.VIEW_NAME ) AND NOT EXISTS ( SELECT * FROM dba_sequences WHERE dba_synonyms.table_name = dba_sequences.sequence_NAME ) AND NOT EXISTS ( SELECT * FROM dba_dependencies WHERE type IN ( 'PACKAGE' ,'PROCEDURE' ,'FUNCTION' ) AND dba_synonyms.table_name = dba_dependencies.NAME ) ) 

对这个错误代码的不直观的解决scheme似乎是同义词指向的对象的问题。

这是我的SQL查找指向错误对象的同义词。

 SELECT S.OWNER as SYN_OWNER, S.SYNONYM_NAME as SYN_NAME, S.TABLE_OWNER as OBJ_OWNER, S.TABLE_NAME as OBJ_NAME, CASE WHEN O.OWNER is null THEN 'MISSING' ELSE O.STATUS END as OBJ_STATUS FROM DBA_SYNONYMS S LEFT JOIN DBA_OBJECTS O ON S.TABLE_OWNER = O.OWNER AND S.TABLE_NAME = O.OBJECT_NAME WHERE O.OWNER is null OR O.STATUS != 'VALID'; 

开发人员不小心编写了生成并运行以下SQL语句的代码: CREATE OR REPLACE PUBLIC SYNONYM "DUAL" FOR "DUAL"; 导致select * from dba_synonyms where table_name = 'DUAL'; 返回PUBLIC DUAL SOME_USER DUAL而不是PUBLIC DUAL SYS DUAL

我们能够解决它(感谢如何重新创build公共同义词“双”? )通过运行

 ALTER SYSTEM SET "_SYSTEM_TRIG_ENABLED"=FALSE SCOPE=MEMORY; CREATE OR REPLACE PUBLIC SYNONYM DUAL FOR SYS.DUAL; ALTER SYSTEM SET "_SYSTEM_TRIG_ENABLED"=true SCOPE=MEMORY; 

我有一个类似的问题,原来是由表和模式名称缺less双引号造成的。

我们有相同的ORA-01775错误,但在我们的情况下,模式用户在一些公共同义词上缺less一些“授予select”。

步骤1)查看名称存在的对象:

 select * from all_objects where object_name = upper('&object_name'); 

这可能是一个同义词存在,但没有表?


步骤2)如果这不是问题,请调查同义词:

 select * from all_synonyms where synonym_name = upper('&synonym_name'); 

这可能是该基础表或视图到该同义词丢失?

ORA-01775:同义词的循环链我正面临上述错误,当我试图编译一个包使用一个对象的同义词被创build,但底层对象不可用。

我们今天遇到这个错误。 这是我们如何debugging和修复它。

  1. 包由于这个错误ORA-01775进入无效状态。

  2. 用错误行号,我们通过package身体代码,发现试图插入数据到table

  3. 我们运行下面的查询来检查上面的tablesynonym存在。

     SELECT * FROM DBA_TABLES WHERE TABLE_NAME = '&TABLE_NAME'; -- No rows returned SELECT * FROM DBA_SYNONYMS WHERE SYNONYM_NAME = '&SYNONYM_NAME'; -- 1 row returned 
  4. 有了这个,我们得出结论,表格需要重新创build。 正如synonym指向一个不存在的table

  5. DBA团队重新创build了这个表并解决了这个问题。

我正在使用下面的SQL查找all_synonyms中没有object_name(在user_objects)对应的对象中的条目:

  select * from all_synonyms where table_owner = 'SCOTT' and synonym_name not like '%/%' and table_name not in ( select object_name from user_objects where object_type in ( 'TABLE', 'VIEW', 'PACKAGE', 'SEQUENCE', 'PROCEDURE', 'FUNCTION', 'TYPE' ) ); 

http://ora-01775.ora-code.com/build议:;

ORA-01775 :同义词循环链
原因 :通过一系列的CREATE同义词陈述,定义了一个自称的同义词。 例如,以下定义是循环的:
CREATE SYNONYM s1 for s2 CREATE SYNONYM s2 for s3 CREATE SYNONYM s3 for s1
操作 :更改一个同义词定义,使其适用于基本表或视图,然后重试该操作。

如果您正在编译一个PROCEDURE,可能这是指一个不存在的表或视图,因为它是在相同的PROCEDURE中创build的。 在这种情况下,解决方法是将查询声明为String,例如v_query: = 'insert into table select * from table2 ,then immediate immediate on v_query ;

这是因为编译器尚未识别该对象,因此没有find该引用。 问候。

我有一个function定义错误的模式,没有公共同义词。 即我的过程是在架构“狗”,function是在架构“猫”。 该function没有一个公共同义词允许狗访问猫的function。

Interesting Posts