728x90
반응형
일단 오랜지나 기본으로 제공하는 것을은 스키마별로 컴파일을 수행 해주게 되다보니 스키마별로 수행을 따로 수행해줘야 한다 그래서 각종 오브젝트 및 public synonym 까지 한방에 컴파일 하는 프로시저를 만들었다..
이건 공유 하는게 좋을듯하여 공유합니다.
프로시저 및 수행 방법은 아래 내용 확인 바람니다.
단) sys계정에서만 가능함.
-- create by soonpyo.jeong 2023.06.26
CREATE OR REPLACE PROCEDURE SYS.PL_INVALID_ALL_COMPILE
IS
V_OWNER DBA_OBJECTS.OWNER%TYPE;
V_OBJECT_TYPE DBA_OBJECTS.OBJECT_TYPE%TYPE;
V_CNT NUMBER;
V_SYNONYM VARCHAR2(4000);
CURSOR OBJECT_INVALID_CUR
IS
SELECT OWNER,OBJECT_TYPE,COUNT(*) CNT
FROM DBA_OBJECTS
WHERE STATUS='INVALID'
GROUP BY OWNER,OBJECT_TYPE ;
CURSOR SYNONYM_REPLACE_CUR
IS
SELECT 'CREATE OR REPLACE PUBLIC SYNONYM '||SYNONYM_NAME||' FOR '||ORG_OBJECT_OWNER||'.'||ORG_OBJECT_NAME||';'
FROM DBA_SYNONYMS
WHERE (OWNER,SYNONYM_NAME) IN (SELECT OWNER, OBJECT_NAME
FROM DBA_OBJECTS
WHERE STATUS = 'INVALID'
AND OWNER='PUBLIC'
AND OBJECT_TYPE='SYNONYM');
type OBJECT_CNT_CUR_TYPE is REF CURSOR;
OBJECT_CNT_CUR OBJECT_CNT_CUR_TYPE;
V_CNT_SQL VARCHAR2(1000);
BEGIN
dbms_output.enable('10000000000');
OPEN OBJECT_INVALID_CUR;
LOOP
FETCH OBJECT_INVALID_CUR INTO V_OWNER,V_OBJECT_TYPE,V_CNT;
--데이터가 없으면 중지
if OBJECT_INVALID_CUR%notfound then
DBMS_OUTPUT.PUT_LINE('OBJECT COMPILE COMPLET');
EXIT;
else
--1. INVAILD 건수 확인
DBMS_OUTPUT.PUT_LINE('컴파일 전 :'||V_OWNER||' '||V_OBJECT_TYPE||': '||V_CNT);
--2. 스키마 별 컴파일
V_CNT_SQL :='SELECT OWNER,OBJECT_TYPE,COUNT(*) FROM DBA_OBJECTS WHERE STATUS=''INVALID'' AND OWNER=:a GROUP BY OWNER,OBJECT_TYPE' ;
OPEN OBJECT_CNT_CUR FOR V_CNT_SQL USING V_OWNER;
LOOP
UTL_RECOMP.RECOMP_SERIAL(''||V_OWNER||'');
FETCH OBJECT_CNT_CUR INTO V_OWNER,V_OBJECT_TYPE,V_CNT;
EXIT WHEN OBJECT_CNT_CUR%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('컴파일 후 :'||V_OWNER||' '||V_OBJECT_TYPE||': '||V_CNT);
END LOOP;
--3. 컴파일 후 INVAILD 건수 확인
CLOSE OBJECT_CNT_CUR;
end if;
END LOOP;
CLOSE OBJECT_INVALID_CUR;
OPEN SYNONYM_REPLACE_CUR;
LOOP
FETCH SYNONYM_REPLACE_CUR INTO V_SYNONYM;
EXIT WHEN SYNONYM_REPLACE_CUR%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(V_SYNONYM);
--1. 시노님 생성 스크립트 다이나믹쿼리로 수행
EXECUTE IMMEDIATE V_SYNONYM;
SELECT COUNT(*)
INTO V_CNT
FROM DBA_SYNONYMS
WHERE (OWNER,SYNONYM_NAME) IN (SELECT OWNER, OBJECT_NAME
FROM DBA_OBJECTS
WHERE STATUS = 'INVALID'
AND OWNER='PUBLIC'
AND OBJECT_TYPE='SYNONYM');
DBMS_OUTPUT.PUT_LINE('재성성 후 : '||V_CNT);
END LOOP;
CLOSE SYNONYM_REPLACE_CUR;
EXCEPTION WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('오류가 발생했다');
DBMS_OUTPUT.PUT_LINE('SQL ERROR CODE: ' || SQLCODE);
DBMS_OUTPUT.PUT_LINE('SQL ERROR MESSAGE: ' || SQLERRM);
DBMS_OUTPUT.PUT_LINE(SYS.dbms_utility.format_error_backtrace);
END ;
/
--인벨리드 점검
call PL_INVALID_ALL_COMPILE;
--인벨리드 오브젝트 전체 확인
select * from dba_objects
where 1=1
and status='INVALID'
and OBJECT_TYPE not in('TABLE','INDEX','LOB') -- recyclebin도 간혹 invaild로 나오기때문에 제외함
order by OWNER,OBJECT_NAME
;
728x90
반응형
'DBMS > Tibero' 카테고리의 다른 글
Tibero TAC+TAS 구축시 구동방법 (0) | 2023.06.26 |
---|---|
Tibero 접속을 위한 ODBC 드라이버 및 등록방법 (0) | 2023.06.26 |
Tibero TAS에서 사용되는 명령어 모음 (0) | 2023.06.26 |
Tibero TAC 설치 방법(Rawdevice 구성) (0) | 2023.06.26 |
Tibero 테이블 스페이스 용량 확인 방법 (1) | 2023.06.26 |