현상
패치 또는 이관 작업 이후, 일부 오브젝트들이 INVALID 상태로 변경되었을 경우 기존에도 INVALID였던 객체가 아닌, 새롭게 INVALID 상태로 변경된 객체만 골라내어 컴파일이 필요한 상황이 발생하였습니다.
원인
패치 또는 이관 과정에서 관련 객체(의존성 객체)들의 변경 또는 삭제 패키지/프로시저/뷰 등 PL/SQL 객체가 참조하는 객체의 구조 변화, 권한 및 시놉시스 문제, 바이너리 또는 DB 설정 차이로 인해 컴파일 오류 등의 사유로 인하여 오브젝트가 INVALID 상태가 될 수 있습니다.
방법
1. 패치,이관 전 invalid 항목 담는 테이블 생성
asis 바이너리에서 invalid 형태의 object를 뽑는 테이블 생성 과정은 다음과 같습니다.
1-1) tbsql tibero/tmax
1-2) 테이블 생성문 수행
CREATE TABLE TIBERO.BEFORE_PATCH AS
SELECT owner, object_name, object_type, status
FROM dba_objects
WHERE status='INVALID';
SQL
복사
2. 패치,이관 후 invalid된 항목 담는 테이블 생성
tobe 바이너리에서 invalid 형태의 object뽑는 테이블 생성 과정은 다음과 같습니다.
2-1) tbsql tibero/tmax
2-2) 테이블 생성문 수행
CREATE TABLE TIBERO.AFTER_PATCH AS
SELECT owner, object_name, object_type, status
FROM dba_objects
WHERE status='INVALID';
SQL
복사
3. 작업(패치,이관) 이후 새로 invalid된 오브젝트 대상 compile문 생성 쿼리
•
로직 설명: AFTER 테이블에는 존재하지만 BEFORE 테이블에는 없는 INVALID 오브젝트들만 필터링하는 로직입니다. 즉, AFTERT테이블 - (MINUS) BEOFORE 테이블 과정을 통하여 새롭게 INVALID 된 항목을 추출합니다.
•
작업 이후 invalid된 항목을 compile 시키는 쿼리생성문 뽑는 쿼리문:
SELECT 'ALTER '||OBJECT_TYPE||' '||OWNER||'.'||OBJECT_NAME||' COMPILE;'
FROM (SELECT * FROM TIBERO.AFTER_PATCH MINUS SELECT * FROM TIBERO.BEFORE_PATCH)
WHERE OBJECT_TYPE IN ('TRIGGER', 'FUNCTION', 'PROCEDURE', 'PACKAGE', 'TYPE','VIEW')
UNION ALL
SELECT 'ALTER PACKAGE '||OWNER||'.'||OBJECT_NAME||' COMPILE BODY;'
FROM (SELECT * FROM TIBERO.AFTER_PATCH MINUS SELECT * FROM TIBERO.BEFORE_PATCH)
WHERE OBJECT_TYPE LIKE '%BODY%';
SQL
복사
참고
invalid 항목을 compile 시키는 로직 해석
4-1) 차집합(MINUS)으로 신규 INVALID 오브젝트 선별
•
MINUS 연산자를 사용하여 첫 번째 결과집합에는 존재하지만 두 번째에는 없는 행만 반환합니다
•
따라서 AFTER_PATCH 테이블의 모든 INVALID 오브젝트 중, 패치 이전에도 INVALID였던 오브젝트는 제외하고, 새롭게 INVALID가 된 오브젝트만 남깁니다.
4-2) 선별되어 INVALID 로 변경된 오브젝트 ALTER 문 만드는 부분 해석
•
일반 오브젝트 컴파일 부분 해석
OBJECT_TYPE이 트리거, 함수, 프로시저, 패키지 사양 등인 경우, 표준 ALTER … COMPILE; 문을 생성합니다.
SELECT 'ALTER '||OBJECT_TYPE||' '||OWNER||'.'||OBJECT_NAME||' COMPILE;'
FROM (
...
)
WHERE OBJECT_TYPE IN ('TRIGGER','FUNCTION','PROCEDURE','PACKAGE','TYPE','VIEW');
SQL
복사
•
패키지 바디 전용 컴파일 부분 해석
PACKAGE BODY 의 경우 여타 오브젝트와 달리 alter문 마지막에 COMPILE BODY 이 필요하므로 별도로 해당 명령어를 추가합니다.
SELECT 'ALTER PACKAGE '||OWNER||'.'||OBJECT_NAME||' COMPILE BODY;'
FROM ( ... )
WHERE OBJECT_TYPE LIKE '%BODY%' PACKAGE BODY;
SQL
복사
예시
•
작업(패치,이관) 이전: select * from tibero.before_patch; → invalid 오브젝트들 조회결과 10건 발생
•
작업(패치,이관) 이후: select * from tibero.after_patch; → invalid 오브젝트들 조회결과 11건 발생
•
SYS 유저의 VW_EMP 테이블이 작업(패치,이관) 이후 invalid로 변경됨을 확인하여 invalid로 변경된 오브젝트에 대해 compile문 생성문 추출 이후 invalid로 변경된 오브젝트를 valid로 변경합니다.