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