복붙노트

[SQL] 어떻게 ORA-01775를 디버깅하는 방법 : 동의어의 반복 체인?

SQL

어떻게 ORA-01775를 디버깅하는 방법 : 동의어의 반복 체인?

나는 ORA-01775 뒤에 문제에 대해 잘 알고 있어요 : 동의어 체인을 반복하지만, 디버깅에 대한 트릭은, 거기 또는 그냥 그것에서 "만들거나 교체"내 방식대로해야합니까?

공공 동의어의 현재 정의가 무엇인지 알아 스키마 또는 무엇이든을 조회 할 수있는 방법이 있습니까?

더욱 멋진는 그래픽 도구가 될 것입니다,하지만이 시점에서, 아무것도 도움이 될 것입니다.

해결법

  1. ==============================

    1.그것이 나오는 것에 따라, 문제는 동의어의 반복 체인,하지만 동의어가 존재하지 않는 뷰를 가리키는되었다는 사실은 사실이 아니었다.

    그것이 나오는 것에 따라, 문제는 동의어의 반복 체인,하지만 동의어가 존재하지 않는 뷰를 가리키는되었다는 사실은 사실이 아니었다.

    이 상태에서 루프 체인으로 밖으로 오라클은 분명히 오류가 발생합니다.

  2. ==============================

    2.당신이 두꺼비를 사용하는 경우,보기> 두꺼비 옵션> 오라클> 일반으로 이동 PLAN_TABLE을 TOAD_PLAN_TABLE를 제거에서 계획 섹션을 설명하고 넣어

    당신이 두꺼비를 사용하는 경우,보기> 두꺼비 옵션> 오라클> 일반으로 이동 PLAN_TABLE을 TOAD_PLAN_TABLE를 제거에서 계획 섹션을 설명하고 넣어

  3. ==============================

    3.데이터 사전 테이블 DBA_SYNONYMS는 데이터베이스의 동의어 모두에 대한 정보를 제공합니다. 당신은 쿼리를 실행할 수 있도록

    데이터 사전 테이블 DBA_SYNONYMS는 데이터베이스의 동의어 모두에 대한 정보를 제공합니다. 당신은 쿼리를 실행할 수 있도록

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

    공용 동의어가 현재를 가리키는 것을 볼 수 있습니다.

  4. ==============================

    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';
    
  5. ==============================

    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
                )
            )
    
  6. ==============================

    6.오늘은이 오류를 얻고, 디버깅 후 나는 내가 사용 동의어를 참조 된 실제 테이블이 misssing되었다는 것을 알아 냈다. 그래서 내가 제안 - 테이블이 존재하는지 여부를 첫 번째 체크! :-))

    오늘은이 오류를 얻고, 디버깅 후 나는 내가 사용 동의어를 참조 된 실제 테이블이 misssing되었다는 것을 알아 냈다. 그래서 내가 제안 - 테이블이 존재하는지 여부를 첫 번째 체크! :-))

  7. ==============================

    7.개발자는 우연히 발생하는 것이 코드를 작성하고 다음과 같은 SQL 문 CREATE OR "DUAL"에 대한 PUBLIC SYNONYM "DUAL"를 교체 실행; TABLE_NAME이 '이중'= dba_synonyms에서 선택 *를 야기한다;  PUBLIC DUAL SOME_USER DUAL보다는 PUBLIC DUAL SYS DUAL를 반환합니다.

    개발자는 우연히 발생하는 것이 코드를 작성하고 다음과 같은 SQL 문 CREATE OR "DUAL"에 대한 PUBLIC SYNONYM "DUAL"를 교체 실행; TABLE_NAME이 '이중'= dba_synonyms에서 선택 *를 야기한다;  PUBLIC DUAL SOME_USER DUAL보다는 PUBLIC DUAL SYS DUAL를 반환합니다.

    우리는 실행하여 (공용 동의어 "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;
    
  8. ==============================

    8.나는 밝혀졌다 비슷한 문제가 테이블 및 스키마 이름 오프 따옴표 누락으로 인해 발생할 수했다.

    나는 밝혀졌다 비슷한 문제가 테이블 및 스키마 이름 오프 따옴표 누락으로 인해 발생할 수했다.

  9. ==============================

    9.우리는 같은 ORA-01775 오류가 발생했지만, 우리의 경우, 스키마 사용자는 일부 대중 동의어의 커플 '을 선택 그랜트 누락되었습니다.

    우리는 같은 ORA-01775 오류가 발생했지만, 우리의 경우, 스키마 사용자는 일부 대중 동의어의 커플 '을 선택 그랜트 누락되었습니다.

  10. ==============================

    10.1 단계) 이름으로 존재하는 개체 무엇을 참조하십시오 :

    1 단계) 이름으로 존재하는 개체 무엇을 참조하십시오 :

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

    그것은 동의어 더 표를 제외한 존재가 될 수 있을까?

    2 단계) 그 문제가 아니라면, 동의어 조사 :

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

    그것은 기본 테이블 또는보기에 그 동의어가 없음을 수 있을까?

  11. ==============================

    11.우리는 오늘이 오류가 발생했습니다. 이것은 우리가 디버깅하고 고정하는 방법이다.

    우리는 오늘이 오류가 발생했습니다. 이것은 우리가 디버깅하고 고정하는 방법이다.

  12. ==============================

    12.재 러드의 대답은 좋은 아이디어이며, 관련 문제의 넓은 범위를 잡는다 동안, 나는이 쿼리가 더 직접적으로 (원래 언급) 문제를 해결하기 위해 오라클 포럼에서 발견 된 발견

    재 러드의 대답은 좋은 아이디어이며, 관련 문제의 넓은 범위를 잡는다 동안, 나는이 쿼리가 더 직접적으로 (원래 언급) 문제를 해결하기 위해 오라클 포럼에서 발견 된 발견

    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. ==============================

    13.ORA-01775 : 동의어의 반복 체인 나는 동의어는 그러나 개체를 사용할 수없는 기본 생성되는 객체를 사용하여 한 패키지를 컴파일하려고 노력하는 동안 나는 위의 오류에 직면했다.

    ORA-01775 : 동의어의 반복 체인 나는 동의어는 그러나 개체를 사용할 수없는 기본 생성되는 객체를 사용하여 한 패키지를 컴파일하려고 노력하는 동안 나는 위의 오류에 직면했다.

  14. ==============================

    14.나는 (USER_OBJECTS 단위) OBJECT_NAME에 대한 해당 객체가없는 경우 all_synonyms에 항목을 찾으려면 다음 SQL을 사용하고 있습니다 :

    나는 (USER_OBJECTS 단위) OBJECT_NAME에 대한 해당 객체가없는 경우 all_synonyms에 항목을 찾으려면 다음 SQL을 사용하고 있습니다 :

     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. ==============================

    15.http://ora-01775.ora-code.com/는 제안 :

    http://ora-01775.ora-code.com/는 제안 :

    ORA-01775 : 동의어의 반복 체인 원인 : 동의어 문을 생성하는 일련의를 통해, 동의어 자체 언급 것으로 정의 하였다. 예를 들면, 다음의 정의는 원형 : CREATE SYNONYM (S1) (S2)에 대한 CREATE SYNONYM S2 S3에 대한 CREATE SYNONYM S3 (S1)에 대한 작업 : 변경 한 동의어 정의 그래서 기본 테이블 또는 뷰에 적용하고 작업을 다시 시도 것이다.

  16. ==============================

    16.당신이 프로 시저를 컴파일하는 경우, 아마도이이 같은 절차에 생성 될 때 존재하지 않는 테이블이나 뷰를 참조한다. 이 경우 해결책은 쿼리 문자열 예 v_query로 선언하는 것입니다 : 테이블에 = '삽입 표 2에서 * 선택하고 v_query에 즉시 실행;

    당신이 프로 시저를 컴파일하는 경우, 아마도이이 같은 절차에 생성 될 때 존재하지 않는 테이블이나 뷰를 참조한다. 이 경우 해결책은 쿼리 문자열 예 v_query로 선언하는 것입니다 : 테이블에 = '삽입 표 2에서 * 선택하고 v_query에 즉시 실행;

    컴파일러는 아직 객체를 인식하지 못하기 때문에 참조를 찾을 수 없기 때문입니다. 인사말.

  17. ==============================

    17.나는 잘못된 스키마와 공용 동의어없이 정의 된 함수를했다. 즉 내 시저 스키마 "개"에 있었고, 함수는 스키마 "고양이"에 있었다. 이 기능은 개는 고양이 '기능에 액세스 할 수 있도록하는 데에 공용 동의어를 가지고 있지 않았다.

    나는 잘못된 스키마와 공용 동의어없이 정의 된 함수를했다. 즉 내 시저 스키마 "개"에 있었고, 함수는 스키마 "고양이"에 있었다. 이 기능은 개는 고양이 '기능에 액세스 할 수 있도록하는 데에 공용 동의어를 가지고 있지 않았다.

  18. ==============================

    18.나를 위해, 테이블 이름과 동의어 모두 존재하지만 서로 다른 소유자 이름 아래. 나는 동의어의 소유자 이름과 일치하는 소유자 이름 아래에서 테이블을 다시 만들어.

    나를 위해, 테이블 이름과 동의어 모두 존재하지만 서로 다른 소유자 이름 아래. 나는 동의어의 소유자 이름과 일치하는 소유자 이름 아래에서 테이블을 다시 만들어.

    나는 @ Mahi_0707에 의해 게시 된 쿼리를 사용

  19. from https://stackoverflow.com/questions/247090/how-to-debug-ora-01775-looping-chain-of-synonyms by cc-by-sa and MIT license