← 개발일지

Oracle Synonym 조회: FOR 대상 테이블 찾는 방법


문제 상황: Synonym이 실제로 어디를 가리키는지 모르겠다

운영 환경에서 SQL을 분석하다 보면
다음과 같은 코드를 자주 보게 됩니다.

SELECT * FROM XMAR_SOME_TABLE;

그런데 실제 테이블이 아니라 Synonym인 경우가 많습니다.

이때 중요한 질문은 하나입니다.

이 Synonym은 실제로 어떤 테이블을 가리키고 있을까?


Synonym 구조 이해 (핵심)

CREATE SYNONYM A FOR B;

여기서:

  • A → Synonym 이름
  • B → 실제 테이블 (schema.table)

중요한 점은 이것입니다.

Oracle은 FOR 절을 문자열로 저장하지 않는다

이미 다음과 같이 분리된 컬럼으로 관리됩니다.

|컬럼|의미| |---|---| |SYNONYM_NAME|시노님 이름| |TABLE_OWNER|실제 테이블 스키마| |TABLE_NAME|실제 테이블|


해결 방법: ALL_SYNONYMS 조회

기본 쿼리

SELECT  
    SYNONYM_NAME,  
    TABLE_OWNER,  
    TABLE_NAME,  
    TABLE_OWNER || '.' || TABLE_NAME AS TARGET  
FROM ALL_SYNONYMS  
WHERE SYNONYM_NAME LIKE 'XMAR%';

이 쿼리를 실행하면:

  • XMAR로 시작하는 모든 Synonym
  • 실제 테이블 위치 (schema.table)

를 한 번에 확인할 수 있습니다.


깨진 Synonym까지 확인하기

운영에서는 종종 이런 문제도 발생합니다.

  • 테이블이 삭제됨
  • 권한 없음
  • 환경이 바뀜

이 경우 Synonym은 존재하지만 실제 테이블은 없습니다.

검증 쿼리

SELECT  
    s.SYNONYM_NAME,  
    CASE   
        WHEN t.TABLE_NAME IS NULL THEN 'BROKEN'  
        ELSE 'OK'  
    END AS STATUS  
FROM ALL_SYNONYMS s  
LEFT JOIN ALL_TABLES t  
       ON t.OWNER = s.TABLE_OWNER  
      AND t.TABLE_NAME = s.TABLE_NAME  
WHERE s.SYNONYM_NAME LIKE 'XMAR%';

실무 팁

어떤 뷰를 써야 하나?

|뷰|설명| |---|---| |USER_SYNONYMS|내가 만든 것| |ALL_SYNONYMS|내가 접근 가능한 것| |DBA_SYNONYMS|전체 (권한 필요)|

일반적으로는 ALL_SYNONYMS를 사용하면 충분합니다.


정리

  • Synonym은 단순 alias가 아니라 메타데이터 기반 구조
  • FOR 절은 문자열이 아니라 컬럼으로 저장됨
  • TABLE_OWNER + TABLE_NAME이 실제 대상
  • JOIN을 활용하면 깨진 Synonym까지 검증 가능e