Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何调试ORA-01775:同义词循环链?_Sql_Oracle_Synonym - Fatal编程技术网

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

Sql 如何调试ORA-01775:同义词循环链?,sql,oracle,synonym,Sql,Oracle,Synonym,我很熟悉ORA-01775背后的问题:同义词循环链,但有什么技巧可以调试它,还是我只需要“创建或替换”我的方法就可以了 有没有一种方法可以查询模式或任何东西来找出公共同义词的当前定义 更棒的是图形化工具,但在这一点上,任何东西都会有帮助。数据字典表DBA\u同义词包含有关数据库中所有同义词的信息。这样就可以运行查询了 SELECT table_owner, table_name, db_link FROM dba_synonyms WHERE owner = 'PUBLIC

我很熟悉ORA-01775背后的问题:同义词循环链,但有什么技巧可以调试它,还是我只需要“创建或替换”我的方法就可以了

有没有一种方法可以查询模式或任何东西来找出公共同义词的当前定义


更棒的是图形化工具,但在这一点上,任何东西都会有帮助。

数据字典表
DBA\u同义词
包含有关数据库中所有同义词的信息。这样就可以运行查询了

SELECT table_owner, table_name, db_link
  FROM dba_synonyms 
 WHERE owner        = 'PUBLIC'
   AND synonym_name = <<synonym name>>
选择表格所有者、表格名称、数据库链接
来自dba_同义词
其中owner='PUBLIC'
和同义词_name=
查看公共同义词当前指向的内容。

建议:

ORA-01775:同义词循环链
原因:通过一系列CREATE同义词语句,定义了一个引用自身的同义词。例如,以下定义是循环的:
为s2创建同义词s1为s3创建同义词s2为s1创建同义词s3


操作:更改一个同义词定义,使其应用于基表或视图,然后重试该操作。

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


Oracle显然是在这种情况下作为循环链出错的。

我也遇到了类似的问题,这是由于表和架构名称缺少双引号造成的。

今天我遇到了这个错误,调试后我发现实际的表错了,我使用同义词来表示。所以我建议-首先检查表是否存在!!:-)

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

我们有相同的ORA-01775错误,但在我们的例子中,架构用户在几个公共同义词上缺少一些“授权选择”。

如果您使用的是TOAD,转到“视图>蟾蜍选项>Oracle>常规”并从“解释计划”部分删除蟾蜍计划表,然后放置计划表(步骤1)查看存在哪些具有名称的对象:

select * from all_objects where object_name = upper('&object_name');
可能存在同义词,但没有表


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

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

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

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


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


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

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

下面是我查找指向错误对象的同义词的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或REPLACE PUBLIC同义词“DUAL”表示“DUAL”导致
从dba_同义词中选择*,其中表_name='DUAL';
返回
PUBLIC DUAL SOME_USER DUAL
而不是
PUBLIC DUAL SYS 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;

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

  • 由于此错误,程序包进入无效状态
    ORA-01775

  • 使用错误行号,我们检查了
    程序包
    主体代码,找到了试图将数据插入
    的代码

  • 我们运行下面的查询来检查上面的
    同义词
    是否存在

    SELECT * FROM DBA_TABLES WHERE TABLE_NAME = '&TABLE_NAME';  -- No rows returned
    
    SELECT * FROM DBA_SYNONYMS WHERE SYNONYM_NAME = '&SYNONYM_NAME'; -- 1 row returned
    
  • 因此,我们得出结论,需要重新创建该表。因为
    同义词
    指向一个不存在的

  • DBA团队重新创建了表,解决了这个问题


  • 我正在使用以下sql查找所有\u同义词中的条目,其中没有对象\u名称对应的对象(在用户\u对象中):


    我在错误的模式中定义了一个函数,并且没有公共同义词。也就是说,我的proc在模式“Dogs”中,函数在模式“Cats”中。该函数没有一个公共同义词,允许狗访问猫的函数。

    虽然Jarrod的答案是个好主意,并且抓住了更广泛的相关问题,但我在Oracle论坛中发现了这个查询,它更直接地解决了(最初声明的)问题:


    您不必费力地浏览其他类型的无效对象。只是那些实际上处于无限循环中的表。

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


    我使用了@Mahi_0707发布的查询,好吧,肯定还有其他事情。如果我创建了一个视图,请为其创建一个同义词,然后在我尝试查询我得到的同义词时删除该视图:ORA-00980:同义词翻译不再有效。视图从中提取的表也都是具有公共同义词的表。这可能与此有关。我收到了相同的错误,因为一个公共同义词指向一个不再存在的表。我发现有趣的是,这个答案是多么有用。。。对我来说,在向包中重新添加过程时,我指的是一个不存在的类型。在重新添加类型后,错误消失了
    SELECT * FROM DBA_TABLES WHERE TABLE_NAME = '&TABLE_NAME';  -- No rows returned
    
    SELECT * FROM DBA_SYNONYMS WHERE SYNONYM_NAME = '&SYNONYM_NAME'; -- 1 row returned
    
     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'
             )
        );
    
    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')