문제

나는 ORA-01775의 문제에 대해 잘 알고 있습니다 : 동의어의 루핑 체인, 디버깅을 할 때 어떤 속임수가 있습니까?

공개 동의어의 현재 정의가 무엇인지 알아내는 스키마를 쿼리하는 방법이 있습니까?

더욱 멋진 것은 그래픽 도구 일 것이지만,이 시점에서는 무엇이든 도움이 될 것입니다.

도움이 되었습니까?

해결책

결과적으로, 문제는 실제로 동의어의 루핑 체인이 아니었지만 동의어가 존재하지 않는 견해를 가리키고 있다는 사실.

Oracle은 분명히이 조건에서 루핑 체인으로 오류가 발생합니다.

다른 팁

두꺼비를 사용하는 경우> Toad Options> Oracle> General을보기로 이동하여 설명 계획 섹션에서 TOAD_PLAN_TALE를 제거하고 Plan_Table을 넣으십시오.

데이터 사전 테이블 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
            )
        )

오늘 나는이 오류를 얻었고, 디버깅 후 실제 테이블이 놓친다는 것을 알았으며, 동의어를 사용하여 언급하고있었습니다. 그래서 나는 제안 - 먼저 테이블이 존재하는지 확인한다 !! :-))

개발자는 실수로 다음 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.

우리는 그것을 고칠 수있었습니다 (감사합니다 공개 동의어 "듀얼"을 재현하는 방법?) 달리기로

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 오류가 있었지만 우리의 경우 스키마 사용자는 공개 동의어에 몇 가지 'Grant Select'가 누락되었습니다.

1 단계) 이름으로 어떤 개체가 있는지 확인하십시오.

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

동의어가 존재하지만 테이블이 없을 수 있습니까?


2 단계) 문제가 아닌 경우 동의어를 조사하십시오.

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

기본 테이블이나 해당 동의어를 보는 것이 누락되었을 수 있습니까?

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

  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 a table 그것은 존재하지 않았습니다.

  5. DBA 팀은 테이블을 다시 만들었고 이로 인해 문제가 해결되었습니다.

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

다음 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'
         )
    );

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

당신은 다른 종류의 유효하지 않은 물체를 통과 할 필요가 없습니다. 실제로 끝없는 루프에있는 것들.

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

ORA-01775: 동의어의 루핑 체인
원인: 일련의 생성 동의어 진술을 통해, 그 자체로 언급 된 동의어가 정의되었습니다. 예를 들어 다음 정의는 원형입니다.
CREATE SYNONYM s1 for s2 CREATE SYNONYM s2 for s3 CREATE SYNONYM s3 for s1
동작: 하나의 동의어 정의를 변경하여 기본 테이블에 적용되거나 조작을보고 재 시도합니다.

프로 시저를 컴파일하는 경우 아마도 동일한 프로 시저에서 생성되지 않은 표 또는보기를 참조 할 수 있습니다. 이 경우 솔루션은 쿼리를 문자열로 선언하는 것입니다. v_query: = 'insert into table select * from table2 그런 다음 즉시 실행하십시오 v_query;

컴파일러가 아직 객체를 인식하지 못하므로 참조를 찾지 못하기 때문입니다. 인사말.

잘못된 스키마와 공개 동의어가없는 함수가 정의되었습니다. 즉, 내 Proc은 스키마 "개"에 있었고 함수는 스키마 "고양이"에있었습니다. 이 기능에는 개가 고양이의 기능에 액세스 할 수 있도록 대중의 동의어가 없었습니다.

저에게있어 테이블 이름과 동의어는 모두 다른 소유자 이름 아래에있었습니다. 동의어로 소유자 이름과 일치하는 소유자 이름으로 테이블을 다시 만들었습니다.

@mahi_0707에 의해 게시 된 쿼리를 사용했습니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top