如何调试ORA-01775:同义词的循环链?

时间:2008-10-29 14:50:04

标签: sql oracle synonym

我熟悉ORA-01775背后的问题:循环同义词链,但有没有调试它的技巧,或者我只需要“创建或替换”我的方法吗?

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

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

18 个答案:

答案 0 :(得分:66)

事实证明,问题实际上并不是同义词的循环链,而是同义词指向一个不存在的视图。

在这种情况下,Oracle显然会错误地将其作为循环链。

答案 1 :(得分:26)

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

答案 2 :(得分:22)

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

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

查看公共同义词当前所指的内容。

答案 3 :(得分:15)

此错误代码的不太直观的解决方案似乎是同义词所指向的对象的问题。

这是我用于查找指向错误对象的同义词的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';

答案 4 :(得分:5)

尝试此选择以查找有问题的同义词,它列出指向不存在的对象的所有同义词(表,视图,序列,包,过程,函数)

SELECT *
FROM dba_synonyms
WHERE table_owner = 'USER'
    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
            )
        )

答案 5 :(得分:3)

今天我收到了这个错误,经过调试后,我发现实际的表格是误导的,我用的是同义词。所以我建议 - 先检查表是否存在!! : - ))

答案 6 :(得分:2)

开发人员意外编写了生成并运行以下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

我们能够通过运行

来修复它(感谢How to recreate public synonym "DUAL"?
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;

答案 7 :(得分:1)

我遇到了类似的问题,原因是缺少表格和模式名称的双引号。

答案 8 :(得分:1)

我们遇到了相同的ORA-01775错误,但在我们的案例中,架构用户在一些公共同义词上缺少一些“grant select”。

答案 9 :(得分:1)

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

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

可能是同义词存在但没有表?


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

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

可能是缺少该同义词的基础表或视图?

答案 10 :(得分:1)

我们今天遇到了这个错误。 这就是我们调试和修复它的方式。

  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. 有了这个,我们得出结论,需要重新创建表。由于synonym指向不存在的table

  5. DBA团队重新创建了表格,这解决了问题。

答案 11 :(得分:0)

ORA-01775:同义词的循环链 我在尝试编译一个使用创建了同义词的对象的Package时遇到了上述错误,但是底层对象不可用。

答案 12 :(得分:0)

虽然Jarrod的答案是一个好主意,并且捕获了更多相关问题,但我发现在Oracle论坛中找到此查询是为了更直接地解决(最初指出的)问题:

select owner, synonym_name, connect_by_iscycle CYCLE
from dba_synonyms
where connect_by_iscycle > 0
connect by nocycle prior table_name = synonym_name
and prior table_owner = owner
union
select 'PUBLIC', synonym_name, 1
from dba_synonyms
where owner = 'PUBLIC'
and table_name = synonym_name
and (table_name, table_owner) not in (select object_name, owner from dba_objects
where object_type != 'SYNONYM')

https://community.oracle.com/message/4176300#4176300

您将不必遍历其他无效对象。那些实际上处于无休止循环中的循环。

答案 13 :(得分:0)

我正在使用以下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'
         )
    );

答案 14 :(得分:-1)

对我来说,表名和同义词都存在,但使用不同的所有者名。我在所有者名称下重新创建了与同义词中的所有者名称匹配的表。

我使用了@ Mahi_0707发布的查询

答案 15 :(得分:-1)

我在错误的架构中定义了一个函数,没有公共同义词。即我的过程是在架构&#34; Dogs&#34;并且该功能在架构&#34; Cats&#34;中。该功能并没有公开的同义词,以允许狗进入猫的“猫”。功能

答案 16 :(得分:-1)

如果您正在编译PROCEDURE,可能这是指在同一个程序中创建的表或视图不存在。在这种情况下,解决方案是将查询声明为String,例如v_query: = 'insert into table select * from table2,然后立即执行v_query;

这是因为编译器尚未识别该对象,因此找不到该引用。问候。

答案 17 :(得分:-1)

http://ora-01775.ora-code.com/建议:

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