【问题标题】:ORA-01775: looping chain of synonymsORA-01775: 同义词循环链
【发布时间】:2021-10-23 08:34:46
【问题描述】:

我正在创建一个表(下面是代码)- 这是通过 unix 上的一些脚本执行的。该脚本还创建了一些同义词(不确定是什么/如何):

drop table BNS_SAA_MESSAGES;
CREATE TABLE BNS_SAA_MESSAGES
(
HostNumber varchar(50) NOT NULL,
SAAMessage varchar(2048) NOT NULL,
PRIMARY KEY (HostNumber)
);

我收到以下错误:

Processing bns_saa_messages
cat: cannot open bns_saa_messages.sql

Commit complete.

GRANT SELECT ON bns_saa_messages TO RL_ORDFX_RPT

GRANT SELECT ON bns_saa_messages TO RL_ORDFX_RPT
                *
ERROR at line 1:
ORA-01775: looping chain of synonyms


GRANT INSERT ON bns_saa_messages TO RL_ORDFX_RPT

GRANT INSERT ON bns_saa_messages TO RL_ORDFX_RPT
                *
ERROR at line 1:
ORA-01775: looping chain of synonyms


GRANT UPDATE ON bns_saa_messages TO RL_ORDFX_RPT

GRANT UPDATE ON bns_saa_messages TO RL_ORDFX_RPT
                *
ERROR at line 1:
ORA-01775: looping chain of synonyms


GRANT DELETE ON bns_saa_messages TO RL_ORDFX_RPT

GRANT DELETE ON bns_saa_messages TO RL_ORDFX_RPT
                *
ERROR at line 1:
ORA-01775: looping chain of synonyms


create public synonym bns_saa_messages for ORDMSO.bns_saa_messages

create public synonym bns_saa_messages for ORDMSO.bns_saa_messages
                      *
ERROR at line 1:
ORA-00955: name is already used by an existing object



Commit complete.

我用谷歌搜索了ORA-01775: looping chain of synonyms,这似乎意味着一个东西被删除了,但有一个指向它的指针。我猜它发生在select 期间,来自不再存在的“事物”。不确定这些东西是桌子还是其他东西。这是我从研究中收集到的。

知道如何创建我的表格吗?我尝试多次执行 SQL 代码,但无济于事 - 我每次都收到相同的错误。

也没有创建表:

SQL> select * from bns_saa_messages;
select * from bns_saa_messages
              *
ERROR at line 1:
ORA-01775: looping chain of synonyms

我查看了以下问题,但似乎没有帮助。也许你能看到我看不到的东西:
I get an ORA-01775: looping chain of synonyms error when I use sqlldr
How to debug ORA-01775: looping chain of synonyms?
ORA-01775: looping chain of synonyms but there are no synonyms

谢谢

:更新:

执行后:select * from all_synonyms where synonym_name = 'BNS_SAA_MESSAGES'; 按照克雷格的建议,我得到:

OWNER                          SYNONYM_NAME
------------------------------ ------------------------------
TABLE_OWNER                    TABLE_NAME
------------------------------ ------------------------------
DB_LINK
--------------------------------------------------------------------------------
PUBLIC                         BNS_SAA_MESSAGES
ORDMSO                         BNS_SAA_MESSAGES

:更新:2
运行中:select * from all_tables where table_name = 'BNS_SAA_MESSAGES';

SQL> select * from all_tables where table_name = 'BNS_SAA_MESSAGES';

no rows selected

【问题讨论】:

    标签: oracle


    【解决方案1】:

    我会运行它来查看同义词实际指向的位置:

    select *
    from all_synonyms
    where synonym_name = 'BNS_SAA_MESSAGES'
    

    我猜同义词指向了错误的 TABLE_OWNER。

    更新

    那么桌子实际上在哪里?您可以使用以下方法找到它:

    select *
    from all_tables
    where table_name = 'BNS_SAA_MESSAGES'
    

    如果 table_owner 不是“ORDMSO”,那么您需要更新同义词以指向正确的位置,或者以 ORDMSO 身份运行 Create table... 脚本。

    更新2

    你能以 ORDMSO 的身份运行 Create table... 脚本吗?如果没有,您将需要让具有更高权限的人运行:

    select *
    from dba_tables
    where table_name = 'BNS_SAA_MESSAGES'
    

    找出表的真正位置,然后相应地更新同义词。

    【讨论】:

    • 您好,我收到以下信息:SQL> select * from dba_synonyms where synonym_name = 'BNS_SAA_MESSAGES'; select * from dba_synonyms where synonym_name = 'BNS_SAA_MESSAGES' * ERROR at line 1: ORA-00942: table or view does not exist
    • 抱歉..您无权访问 dba_synonyms 视图。我将查询更改为使用 all_synonyms 视图,您应该可以访问它。
    • 谢谢;有效;我将用这些数据更新我的问题
    【解决方案2】:

    看起来输出来自第二次运行,正如您所暗示的那样; create public synonym 中的 ORA-00955 表明在某处之前已经完成(就像您运行的 all_synonyms 查询一样),并且它显然存在于其他错误中。第一次运行时不会出现这些错误,但以后每次运行时都会出现。

    如果您希望它可以重新运行,则至少第一个代码 sn-p 应该在删除表之前删除公共同义词。

    但第一个 sn-p 似乎根本没有运行。没有来自 Oracle 的成功或失败消息。唯一真正的线索是:

    Processing bns_saa_messages
    cat: cannot open bns_saa_messages.sql
    

    这是一个 shell 脚本问题,而不是真正的 Oracle 问题。如果没有看到 shell 脚本,很难判断出了什么问题,但我怀疑该脚本正在从各种来源构建一个临时的 .sql 文件,然后通过 SQL*Plus 运行它;但重要的bns_saa_messages.sql 文件丢失了。大概这就是第一个 sn-p 应该在的地方;并且由于这似乎存在,这可能很简单,因为文件和脚本所期望的名称不匹配,或者脚本正在执行cd 并且文件位于错误的目录中,或者同样微不足道的事情。但也许不是……没有足够的信息。

    【讨论】:

    • cat 问题已通过授予脚本读取 bns_saa_messages.sql 的权限得到解决。一旦发生这种情况,脚本就会删除旧的同义词,一切都很好。有人告诉我,这个问题在 99% 的情况下都不应该发生,但有时脚本会出错。 .... 令人惊奇。发送很多:)
    【解决方案3】:

    您是否正在生成导出?

    我使用 BD oracle 11g 的解决方案是:

    查看 SYS_EXPORT 对象,使用 Oracle SQL Developer,连接到数据库并执行以下操作:

    从 dba_objects 中选择 owner、object_name、object_type、status where object_name like '%SYS_EXPORT%'

    Objects SYS_EXPORT

    然后用用户:sqlplus / as sysdba 删除创建的对象。

    Delete objects SYS_EXPORT

    SQL>删除公共同义词 sys_export_full_01;

    SQL>删除公共同义词 sys_export_full_02;

    SQL>删除公共同义词 sys_export_full_03;

    SQL>删除公共同义词 sys_export_full_04;

    在此之后,您可以生成导出。

    【讨论】:

    • 您好,欢迎来到 Stack Overflow!请拨打tour。另请查看help center 以获取有关如何格式化代码的信息。
    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    • 2015-08-23
    • 2018-11-23
    • 2012-03-23
    相关资源
    最近更新 更多