프로그래밍

[오라클초보] ORA-01775: 동의어가 순환 고리 유형으로 정의되어 있습니다. 오류 발생시

할랑할랑 2010. 7. 14. 00:58
반응형

[오라클초보] ORA-01775: 동의어가 순환 고리 유형으로 정의되어 있습니다. 오류 발생시(oracle error)
※ 오류 메시지
(한글) ORA-01775: 동의어가 순환 고리 유형으로 정의되어 있습니다.
(영어) ORA-01775: looping chain of synonyms


주로 해당 테이블이 삭제되었거나, 해당 테이블에 대한 권한이 없을 경우 발생하는 오류입니다.

제 경우에는, public synonym을 만들어 둔 상태에서 테이블이 drop한 걸 모르고 조회했더니 해당 오류가 발생하더군요. 해당 table을 다시 create하거나, synonym을 drop한 후 새로 만들거나, 테이블 select 권한 등을 grant 해주어야겠습니다.

-- 이렇게 임시로 테이블을 만들고
CREATE TABLE TEMP_EXAMPLE_20100624
(
       TEMP_ID       VARCHAR2(10)
     , TEMP_NAME VARCHAR2(40)
);

-- 퍼블릭 시노님을 생성합니다.
CREATE PUBLIC SYNONYM TEMP_EXAMPLE_20100624 FOR TEMP_EXAMPLE_20100624;

-- 이제 테이블을 DROP하면
DROP TABLE TEMP_EXAMPLE_20100624;

-- 테이블 삭제(drop,드롭,드랍) 시 권한(grant)는 함께 지워지더라고, 동의어는 그대로 남아있기 때문에, 테이블을 참조하면 "동의어 순환 고리 오류(looping chain of synonyms)"가 발생합니다.
DESC TEMP_EXAMPLE_20100624;
SELECT * FROM TEMP_EXAMPLE_20100624;

해당 테이블의 권한을 확인해보거나, 테이블이 없다면 새로 생성해야겠습니다. 혹은, 더 이상 쓸모없는 synonym을 아예 없애버리든지요. 동의어를 삭제한 후, 원하는 테이블에 대한 동의어를 새로 생성해보기도 해야할 수도 있고요.
DROP PUBLIC SYNOYM TEMP_EXAMPLE_20100624;

시노님이 어떤 테이블을 참조했었는지 알기 위해, ALL_SYNONYMS 테이블이나 DBA_SYNONYMS 테이블을 참고하는게 좋겠네요.
SELECT * FROM ALL_SYNONYMS WHERE TABLE_NAME = 'TEMP_EXAMPLE_20100624';
SELECT * FROM ALL_SYNONYMS WHERE SYNONYM_NAME = 'TEMP_EXAMPLE_20100624';
SELECT * FROM DBA_SYNONYMS;
... 등등
반응형