오라클 사용자의 경우 INVALID 상태인 OBJECT들을 종종 볼 수 있는데, 연관있는 OBJECT들이 ALTER나 DROP 되었을 경우 의존관계가 깨지면서 발생합니다.
대게는 실행 시 자동으로 컴파일 되지만, 오류가 있다면 컴파일이 되지 않고 에러가 발생합니다.
해당 OBJECT들이 INVALID 상태가 되면 실행이 불가하기 때문에 모니터링 프로시저를 작성해 INVALID 상태인 OBJECT들이 있는지 주기적으로 확인하는 것도 하나의 방법입니다.
- OBJECT TPYE : VIEW, FUNCTION, TRIGGER, PROCEDURE, PACKAGE, PACKAGE BODY
그럼 INVALID 상태의 OBJECT를 확인하는 방법을 알아보겠습니다.
1. INVALID 상태의 OBJECT 확인
SELECT OBJECT_TYPE,OWNER,OBJECT_NAME, STATUS
FROM ALL_OBJECTS
WHERE OBJECT_TYPE IN ('VIEW','FUNCTION','TRIGGER','PROCEDURE','PACKAGE','PACKAGE BODY')
AND STATUS='INVALID' ORDER BY 1;
위 쿼리를 실행하면 OBJECT 종류, 스키마, 오브젝트명, 상태를 확인할 수 있습니다.
2. INVALID 상태 OBJECT 컴파일
ALTER VIEW "뷰명" COMPILE;
ALTER FUNCTION "함수명" COMPILE;
ALTER TRIGGER "트리거명" COMPILE;
ALTER PROCEDURE "프로시저명" COMPILE;
ALTER PACKAGE "패키지명" COMPILE;
뷰, 함수, 트리거, 프로시저, 패키지 등을 위 쿼리와 같이 컴파일을 할 수 있습니다.
INVALID 상태의 OBJECT들을 조회하고 하나하나 컴파일을 하기에는 시간이 오래 걸리니, 아래 쿼리로 컴파일 구문을 조회해 실행하는 것도 방법입니다.
SELECT'ALTER '||DECODE(OBJECT_TYPE,'PACKAGE BODY','PACKAGE',OBJECT_TYPE)||' '||OWNER||'.'||OBJECT_NAME||' COMPILE'||DECODE(OBJECT_TYPE,'PACKAGE BODY',' BODY;',';') AS QUERY
FROM DBA_OBJECTS
WHERE OBJECT_TYPE IN ('VIEW','FUNCTION','TRIGGER','PROCEDURE','PACKAGE','PACKAGE BODY')
AND STATUS = 'INVALID'
ORDER BY OWNER, DECODE(OBJECT_TYPE,'VIEW','A','FUNCTION','B','TRIGGER','C','PROCEDURE','D','PACKAGE','E','PACKAGE BODY','F'), OBJECT_NAME;
특정 OBJECT들만 컴파일을 할 경우에는 WHERE절에 조건을 하나 추가해서 해당 OBJECT들만 컴파일을 해도 됩니다.
이렇게 오라클에서 INVALID 상태인 OBJECT들을 확인하는 방법과 컴파일 하는 방법에 대해 알아보았습니다.
특정 OBJECT들이 동작하지 않을 때 INVALID 상태인지 여부를 확인해보시기 바랍니다.