如何调试 ORA-01775:同义词循环链?
Posted
技术标签:
【中文标题】如何调试 ORA-01775:同义词循环链?【英文标题】:How to debug ORA-01775: looping chain of synonyms? 【发布时间】:2008-10-29 14:50:03 【问题描述】:我熟悉 ORA-01775 背后的问题:同义词循环链,但有什么技巧可以调试它,还是我只需要“创建或替换”我的方法?
有没有办法查询架构或其他任何方法来找出公共同义词的当前定义是什么?
更棒的是图形工具,但在这一点上,任何东西都会有帮助。
【问题讨论】:
【参考方案1】:事实证明,问题实际上并不是同义词的循环链,而是同义词指向一个不存在的视图这一事实。
在这种情况下,Oracle 显然错误为循环链。
【讨论】:
嗯,肯定有更多事情发生。如果我创建一个视图,为其创建一个同义词,然后删除该视图,当我尝试查询我得到的同义词时:ORA-00980:同义词翻译不再有效。 视图从中提取的表都是具有公共同义词的表。这可能与它有关。 我收到了同样的错误,因为公共同义词指向一个不再存在的表。 我觉得有趣的是这个答案有多么有用......对我来说,我在将过程重新添加到包时指的是不存在的类型。重新添加类型后,错误消失了。 丢失的对象可以通过丢失创建链【参考方案2】:如果您使用的是 TOAD,请转到查看>Toad 选项>Oracle>常规并从解释计划部分删除 TOAD_PLAN_TABLE 并放入 PLAN_TABLE
【讨论】:
谢谢。这是我在 Toad for Oracle 中遇到的问题。 或者更好的是,使用sys.plan_table$
。【参考方案3】:
数据字典表DBA_SYNONYMS
包含有关数据库中所有同义词的信息。所以你可以运行查询
SELECT table_owner, table_name, db_link
FROM dba_synonyms
WHERE owner = 'PUBLIC'
AND synonym_name = <<synonym name>>
查看公共同义词当前指向的内容。
【讨论】:
AND synonym_name LIKE '%synonym name%' -- 更有帮助。 如果您无权访问 dba_synonyms,您可以尝试对 all_synonyms 进行相同的查询【参考方案4】:此错误代码不太直观的解决方案似乎是同义词指向的对象存在问题。
这是我用于查找指向错误对象的同义词的 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';
【讨论】:
最佳答案。一种找出问题所在的方法。 @Jarrod Chesney 如何处理此查询的结果? @Daniel Belém Duarte 重新创建丢失的对象,然后重新编译。为我工作。很棒的一段代码。【参考方案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
)
)
【讨论】:
这仅适用于特定模式和特定类型的对象。如果它引用 dba_objects 会更好。 我建议更改最后一个条件:AND NOT EXISTS ( SELECT * FROM all_objects WHERE object_type NOT IN ( 'SYNONYM' ) AND dba_synonyms.table_name = all_objects.OBJECT_NAME )
【参考方案6】:
今天我遇到了这个错误,调试后我发现实际的表丢失了,我指的是使用同义词。所以我建议 - 首先检查表是否存在! :-))
【讨论】:
在我的情况下,“缺失”表只是由不同的数据库用户拥有。这个主题的各种变化!【参考方案7】:第 1 步)查看名称中存在哪些对象:
select * from all_objects where object_name = upper('&object_name');
可能存在同义词但没有表?
第 2 步)如果这不是问题,请调查同义词:
select * from all_synonyms where synonym_name = upper('&synonym_name');
可能是缺少该同义词的基础表或视图?
【讨论】:
没有创建表我创建了公共同义词,因为这个表需要从另一个模式访问,我执行了不起作用的授权。我尝试了从 so_and_so_table 中选择 *;查询返回 >“ORA-01775 循环同义词链”。创建表后,此问题已修复。【参考方案8】:开发人员不小心编写了生成并运行以下 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;
【讨论】:
【参考方案9】:虽然 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
您不必费力地穿过其他类型的无效对象。只是那些实际上处于无限循环中的那些。
【讨论】:
【参考方案10】:我遇到了类似的问题,结果是由于表和架构名称中缺少双引号引起的。
【讨论】:
【参考方案11】:我们有同样的 ORA-01775 错误,但在我们的例子中,架构用户在几个公共同义词上缺少一些“授权选择”。
【讨论】:
【参考方案12】:我们今天遇到了这个错误。 这就是我们调试和修复它的方式。
由于此错误ORA-01775
,包进入无效状态。
使用错误行号,我们通过package
正文代码找到了试图将数据插入table
的代码。
我们运行下面的查询来检查上面的table
和synonym
是否存在。
SELECT * FROM DBA_TABLES WHERE TABLE_NAME = '&TABLE_NAME'; -- No rows returned
SELECT * FROM DBA_SYNONYMS WHERE SYNONYM_NAME = '&SYNONYM_NAME'; -- 1 row returned
由此我们得出结论,需要重新创建表。因为synonym
指向一个不存在的table
。
DBA 团队重新创建了表,这解决了问题。
【讨论】:
【参考方案13】:ORA-01775:同义词循环链 当我试图编译一个包时遇到了上述错误,该包正在使用一个为其创建了同义词但底层对象不可用的对象。
【讨论】:
【参考方案14】:我正在使用以下 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'
)
);
【讨论】:
【参考方案15】:http://ora-01775.ora-code.com/ 建议:
ORA-01775:同义词循环链原因:通过一系列 CREATE 同义词语句,定义了引用自身的同义词。例如,以下定义是循环的:CREATE SYNONYM s1 for s2 CREATE SYNONYM s2 for s3 CREATE SYNONYM s3 for s1
操作:更改同义词定义,使其适用于基表或视图,然后重试操作。
【讨论】:
-1 OP 了解什么是循环链。这个问题要求的是一种方法来识别哪些同义词被破坏了。 @KshitizSharma - 显然您没有阅读 OP 或我的答案,来自 Ora-code.com 的引述。引文中的“Action”应该已经回答了他的问题。而且由于过去 8 年来没有人觉得有必要说这是错误的,因此您的反对票并不是特别有用。你有更好的答案吗?如果不是,并且考虑到此处已有近十年的问题和答案,我将不胜感激您的反对票。 OP 已要求一种方法来查询架构以查找无效同义词或图形工具来定位和修复。通过修改同义词定义自行修复的建议不算作调试技巧。它的年代,或者我缺乏解决方案与这个质量无关。【参考方案16】:如果您正在编译 PROCEDURE,这可能是指在同一 PROCEDURE 中创建时不存在的表或视图。在这种情况下,解决方案是将查询声明为字符串,例如v_query: = 'insert into table select * from table2
,然后在v_query
上立即执行;
这是因为编译器尚未识别对象,因此找不到引用。问候。
【讨论】:
【参考方案17】:我在错误的架构中定义了一个函数,并且没有公共同义词。 IE。我的过程在模式“狗”中,函数在模式“猫”中。该函数没有公开的同义词以允许 Dogs 访问猫的函数。
【讨论】:
【参考方案18】:对我来说,表名和同义词都存在,但所有者名称不同。我在与同义词中的所有者名称匹配的所有者名称下重新创建了表。
我使用了@Mahi_0707 发布的查询
【讨论】:
以上是关于如何调试 ORA-01775:同义词循环链?的主要内容,如果未能解决你的问题,请参考以下文章