source

ORA-01775: 유사어 루프 체인 디버깅 방법

factcode 2023. 3. 10. 22:47
반응형

ORA-01775: 유사어 루프 체인 디버깅 방법

ORA-01775: 유사어 루프 체인의 문제는 잘 알고 있습니다만, 디버깅하는 요령이 있습니까?아니면 '작성 또는 치환'만 하면 됩니까?

스키마나 다른 것을 조회하여 현재 공용 동의어의 정의를 확인할 수 있는 방법이 있습니까?

훨씬 더 멋진 그래픽 도구가 될 수 있지만, 이 시점에서는 어떤 것이든 도움이 될 것입니다.

사실 문제는 동의어의 순환이 아니라의어가 존재하지 않는 관점을 가리키고 있다는 사실이 밝혀졌습니다

이 상태에서는 Oracle이 루프 체인으로 잘못 표시됩니다.

TOAD 를 사용하고 있는 경우는, View > 로 이동합니다.[ Toad Options ]> [ Oracle ]> [ EXPLIDE PLAN ]섹션에서 TOAD_PLAN_TABLE을 일반 및 삭제하고 PLAN_Tab을 배치합니다.LE

테이블 " " "DBA_SYNONYMS에는 데이터베이스 내의 모든 동의어에 대한 정보가 포함되어 있습니다. 이 할 수 .

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

현재 대중 동의어가 무엇을 가리키고 있는지 알아봅니다.

이 에러 코드에 대한 직관적인 해결책은 동의어가 가리키는 객체의 문제인 것 같습니다.

이것은 잘못된 개체를 가리키는 동의어를 찾기 위한 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';

문제가 있는 동의어를 찾으려면 이 옵션을 선택합니다. 존재하지 않는 개체를 가리키는 모든 동의어가 나열됩니다(테이블, 뷰, 시퀀스, 패키지, 프로시저, 함수).

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
            )
        )

오늘 이 에러가 발생했습니다.디버깅을 한 결과, 동의어를 사용하여 참조하고 있던 실제 테이블이 잘못 사용되고 있는 것을 알 수 있었습니다.우선 테이블이 존재하는지 확인하세요!! :-)

스텝 1) 다음 이름으로 존재하는 오브젝트를 확인합니다.

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

동의어가 존재하지만 테이블이 없는 경우일 수 있습니다.


2단계) 문제가 없는 경우 동의어를 조사합니다.

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

해당 동의어의 기본 테이블 또는 보기가 누락되었을 수 있습니다.

로 다음 문을 했습니다.CREATE OR REPLACE PUBLIC SYNONYM "DUAL" FOR "DUAL";이 이 되어select * from dba_synonyms where table_name = 'DUAL'; PUBLIC DUAL SOME_USER DUALPUBLIC 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;

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

다른 종류의 유효하지 않은 물체를 통과하지 않아도 됩니다.끝없는 루프에 있는 사람들만요

비슷한 문제가 있었는데 테이블과 스키마 이름에서 큰따옴표가 빠져서 발생한 것으로 판명되었습니다.

동일한 ORA-01775 오류가 발생했지만, 이 경우 스키마 사용자가 몇 가지 공용 동의어에 'grant select'가 누락되었습니다.

오늘 이 오류가 발생했습니다.이렇게 해서 디버깅하고 수정했습니다.

  1. 에러로 , 가 되었습니다.ORA-01775.

  2. 에 대해서는, 「」, 「이행」, 「을 참조해 주세요.package.table.

  3. 하여 위의 문의를 했습니다.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
    
  4. 이를 통해 표를 다시 만들어야 한다는 결론을 내렸다.synonym was was was was was 。table그런 건 없었어요

  5. DBA 팀은 테이블을 재작성하여 문제를 해결했습니다.

ORA-01775: 동의어가 생성되었지만 기본 개체를 사용할 수 없는 패키지를 컴파일하는 동안 위의 오류에 직면했습니다.

object_name(user_objects)에 대응하는 개체가 없는 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'
         )
    );

http://ora-01775.ora-code.com/는 다음을 제안합니다.

ORA-01775: 유사어 루프 체인
원인: 일련의 CREATE 동의어 문장을 통해 자신을 참조하는 동의어가 정의되었습니다.예를 들어, 다음 정의는 순환형입니다.
CREATE SYNONYM s1 for s2 CREATE SYNONYM s2 for s3 CREATE SYNONYM s3 for s1
조치: 하나의 동의어 정의를 변경하여 기본 테이블 또는 보기에 적용하고 작업을 다시 시도하십시오.

PROCEDOR를 컴파일 하는 경우는, 같은 PROCEDOR로 작성되기 때문에 존재하지 않는 테이블 또는 뷰를 참조하고 있을 가능성이 있습니다.은 쿼리를 (예: String)으로입니다.v_query: = 'insert into table select * from table2 v_query;

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

잘못된 스키마에 정의된 함수와 공용 동의어가 없습니다.즉, 내 담당자는 스키마 "Dogs"에 있고 함수는 스키마 "Cats"에 있습니다.이 기능에는 개들이 고양이의 기능에 접근할 수 있도록 하기 위한 공용 동의어가 없었다.

저는 테이블 이름과 동의어가 모두 존재하지만 소유자의 이름은 달랐습니다.동의어로 소유자 이름과 일치하는 테이블을 소유자 이름으로 다시 만들었습니다.

@Mahi_0707이 올린 쿼리를 사용했습니다.

언급URL : https://stackoverflow.com/questions/247090/how-to-debug-ora-01775-looping-chain-of-synonyms

반응형