티스토리 뷰
개요
Oracle Database 12cR2 이후로 DBMS_JOB 패키지는 더 이상 사용되지 않으며, Oracle 19c에서는 DBMS_JOB으로 생성된 모든 작업이 자동으로 DBMS_SCHEDULER 작업으로 변환됩니다. 이 문서에서는 이러한 변화에 대한 개요와 주요 사항을 정리합니다.
DBMS_JOB을 사용한 작업 생성
1. 기존 작업 조회
conn test/test@pdb1
column what format a30
select job, what from user_jobs;
출력 결과:
0 rows selected.
2. DBMS_JOB을 이용한 작업 생성
declare
l_job pls_integer;
begin
dbms_job.submit (
job => l_job,
what => 'begin null; end;',
next_date => trunc(sysdate)+1,
interval => 'trunc(sysdate)+1'
);
end;
/
3. 생성된 작업 조회
select job, what from user_jobs;
출력 결과:
JOB WHAT
---- ------------------------------
1 begin null; end;
select job_name, job_action from user_scheduler_jobs;
출력 결과:
JOB_NAME JOB_ACTION
-------------- ------------------------------
DBMS_JOB$_1 begin null; end;
트랜잭션 작업 (Transactional Jobs)
DBMS_JOB을 이용하면 트랜잭션 내에서 작업을 생성하고 롤백할 수 있습니다. DBMS_SCHEDULER로 변환된 작업도 동일한 방식으로 작동합니다.
1. 새로운 Session에서 작업 조회
conn test/test@pdb1
select job, what from user_jobs;
출력 결과:
0 rows selected.
2. 기존 Session에서 Rollback 후 작업 조회
rollback;
select job, what from user_jobs;
출력 결과:
0 rows selected.
Materialized View Refresh Groups
Oracle 19c에서는 DBMS_JOB을 사용하여 구현되던 Materialized View Refresh Groups이 DBMS_SCHEDULER를 사용하여 처리됩니다.
1. Table 및 Materialized View 생성
create table t1 (id number);
create materialized view t1_mv
refresh force
on demand
as
select * from t1;
2. Refresh Group 생성
begin
dbms_refresh.make(
name => 'MINUTE_REFRESH',
next_date => sysdate,
interval => 'sysdate + 1/(60*24)',
job => 0);
end;
/
3. 작업 조회
select job_name, job_action from user_scheduler_jobs;
출력 결과:
JOB_NAME JOB_ACTION
---------------- ------------------------------
MV_RF$J_0_S_210 dbms_refresh.refresh('"TEST"."MINUTE_REFRESH"');
4. Rollback 후 작업 조회
rollback;
select job_name, job_action from user_scheduler_jobs;
출력 결과:
0 rows selected.
보안 문제: CREATE JOB 권한 필요
Oracle 19c에서는 DBMS_JOB을 사용하여 작업을 생성하려면 CREATE JOB 권한이 필요합니다.
1. 권한 없이 작업 생성 시도
create user test2 identified by test2;
grant create session to test2;
conn test2/test2@pdb1
declare
l_job pls_integer;
begin
dbms_job.submit (
job => l_job,
what => 'begin null; end;',
next_date => trunc(sysdate)+1,
interval => 'trunc(sysdate)+1'
);
end;
/
출력 결과:
ORA-27486: insufficient privileges
2. Refresh Group을 이용한 우회 방법
begin
dbms_refresh.make(
name => 'MINUTE_REFRESH',
next_date => sysdate,
interval => 'sysdate + 1/(60*24)',
job => 0);
end;
/
select job_name, job_action from user_scheduler_jobs;
출력 결과:
JOB_NAME JOB_ACTION
---------------- ------------------------------
MV_RF$J_0_S_242 dbms_refresh.refresh('"TEST2"."MINUTE_REFRESH"');
3. 작업 속성 변경
begin
dbms_scheduler.set_attribute (
name => 'MV_RF$J_0_S_242',
attribute => 'job_action',
value => 'begin null; end;'
);
end;
/
DBMS_REFRESH 패키지를 통해 권한 없이 작업을 생성할 수 있는 보안 문제가 있으며, 이를 해결하기 위해 DBMS_REFRESH 패키지에 대한 EXECUTE 권한을 PUBLIC에서 제거하는 것이 권장됩니다.
기타 사항
- CREATE JOB 권한이 없으면 DBMS_JOB을 사용할 수 없습니다.
- 19c 업그레이드 시 기존 DBMS_JOB 작업은 자동으로 DBMS_SCHEDULER로 변환됩니다.
- SCHEDULER$_DBMSJOB_MAP 뷰에서 변환된 작업을 확인할 수 있습니다.
SQL> desc scheduler$_dbmsjob_map;
Name Null? Type
--------------- -------- -------------
DBMS_JOB_NUMBER NOT NULL NUMBER
JOB_OWNER NOT NULL VARCHAR2(128)
JOB_NAME NOT NULL VARCHAR2(128)
결론
Oracle 19c에서는 DBMS_JOB 패키지가 더 이상 권장되지 않으며, 모든 작업이 DBMS_SCHEDULER로 변환됩니다. 트랜잭션을 유지하는 기능은 제공되지만, 보안 정책이 변경되었으므로 이에 대한 대비가 필요합니다. 또한, DBMS_REFRESH를 이용한 보안 우회 가능성이 있으므로 주의가 필요합니다.
참고 자료
'코드레시피' 카테고리의 다른 글
CI/CD를 통한 데이터 플랫폼 고도화 가이드 (2) | 2025.05.15 |
---|---|
Oracle 19c DB Patch Guide (0) | 2025.04.09 |
Oracle DMU(Database Migration Assistant for Unicode)가 뭘까? (4) | 2025.04.01 |
Oracle 19c 환경에서 CSSCAN 설치 방법 (0) | 2025.04.01 |
Oracle CSSCAN 설치 및 확인 메뉴얼 (1) | 2025.03.24 |
- Total
- Today
- Yesterday
- 건강 디저트
- 양압기
- 탈모예방
- 수면 다원검사
- 다이어트
- 세마글루타이드
- 위고비
- 구읍뱃터 맛집
- RMAN
- 건강관리
- 마운자로
- 여름건강관리
- 잇몸퇴축
- 두피마사지
- 뱃살제거
- 심장 건강
- 코르티솔
- 다이어트 식단
- GLP-1
- csscan
- 내돈내산
- 난임치료
- 비만치료제
- oracle 19c
- dmu
- deepseek
- 저속노화
- 홈카페
- 건강한식단
- oracle19c
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |