[Oracle] 시노님(Synonym)의 유효성을 점검하는 방법

시노님(Synonym)은 데이터배이스 링크(Database Link)와 마찬가지로 생성 시점에는 논리적 연결만 정의하고, 실제 참조 시점(Runtime)에 대상 객체의 존재 여부를 확인합니다. 즉 생성 시점에 DDL 문법이 정확하다면 dba_objects 뷰의 객체 상태(status 컬럼)의 값은 VALID이기 때문에 Invalid Object로 확인되지 않고, 실행 시점에 ORA-00980 오류를 발생합니다.
따라서 시노님이 가리키는 1) 원본 객체의 소유자(User)가 삭제되었거나 2) 원본 객체(Table/View 등)가 삭제된 경우를 점검하는 스크립트가 필요합니다.

SET LINESIZE 300
SET PAGESIZE 1000
COL OWNER FOR A15
COL SYNONYM_NAME FOR A25
COL TABLE_OWNER FOR A15
COL TABLE_NAME FOR A25
COL ERROR_TYPE FOR A30
COL DROP_COMMAND FOR A100

SELECT 
    s.owner, 
    s.synonym_name, 
    s.table_owner, 
    s.table_name,
    CASE 
        WHEN u.username IS NULL THEN 'MISSING OWNER (USER)'
        WHEN o.object_name IS NULL THEN 'MISSING OBJECT (TABLE/VIEW)'
        ELSE 'INVALID STATUS'
    END AS ERROR_TYPE,
    'DROP ' || DECODE(s.owner, 'PUBLIC', 'PUBLIC SYNONYM ', 'SYNONYM ' || s.owner || '.') || s.synonym_name || ';' AS DROP_COMMAND
FROM dba_synonyms s
LEFT JOIN dba_users u   ON s.table_owner = u.username
LEFT JOIN dba_objects o ON s.table_owner = o.owner 
                       AND s.table_name = o.object_name
WHERE (u.username IS NULL OR o.object_name IS NULL)
  AND s.owner NOT IN ('SYS', 'SYSTEM') -- 시스템 기본 시노님 제외 옵션
ORDER BY s.owner, s.synonym_name;

이 스크립트를 통해 조회된 리스트가 생각보다 많을 수 있습니다. 특히 공용 시노님(Public Synonym)은 관리가 소홀하면 유령 데이터가 많이 남습니다. 삭제 대신 새로운 사용자(NEW_USER)로 일괄 변경(Replace)하려면 아래 스니핏을 위 쿼리에 추가합니다.

'CREATE OR REPLACE ' || DECODE(s.owner, 'PUBLIC', 'PUBLIC SYNONYM ', 'SYNONYM ' || s.owner || '.') || s.synonym_name || ' FOR NEW_USER.' || s.table_name || ';' AS FIX_COMMAND

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다