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

Jos*_*off 44 sql oracle synonym

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

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

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

Jos*_*off 70

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

在这种情况下,Oracle显然是错误的循环链.

  • 视图所从的表格也是包含公共同义词的所有表格.这可能与它有关. (2认同)
  • 我发现有趣的是这个答案是多么有用......对我而言,在将程序重新添加到包时,我指的是一种不存在的类型.重新添加类型后,错误就消失了. (2认同)
  • 丢失的对象可以通过丢失来创建链 (2认同)

LJT*_*LJT 27

如果您使用的是TOAD,请转到视图> Toad选项> Oracle>常规并从EXPLAIN PLAN部分中删除TOAD_PLAN_TABLE并放入PLAN_TABLE


Jus*_*ave 22

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

SELECT table_owner, table_name, db_link
  FROM dba_synonyms 
 WHERE owner        = 'PUBLIC'
   AND synonym_name = <<synonym name>>
Run Code Online (Sandbox Code Playgroud)

看看公共同义词目前指的是什么.

  • AND synonym_name LIKE'%同义词名称%' - 更有帮助. (4认同)

Jar*_*ney 18

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

这是我用于查找指向错误对象的同义词的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';
Run Code Online (Sandbox Code Playgroud)

  • 最好的答案.找出破碎的方法. (2认同)

Mic*_*zyk 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
            )
        )
Run Code Online (Sandbox Code Playgroud)