내용 목차
본 장에서는 DBMS_REDEFINITION 패키지의 기본 개념과 패키지 내의 프러시저를 사용하는 방법을 설명한다.
DBMS_REDEFINITION은 온라인 상태에서 특정 테이블을 재정의하기 위한 프러시저를 제공하는 패키지이다. DBMS_REDEFINITION을 사용하기 위해서는 EXECUTE ON DBMS_REDEFINITION과 CREATE ANY MATERIALIZED VIEW 권한이 필요하다.
재정의할 대상인 원본 테이블을 지정된 컬럼 대응 정보에 따라 새 테이블로 재정의할 수 있다. 새 테이블은 재정의 수행 이전에 미리 생성되어 있어야 하며, 재정의가 끝나면 원본 테이블의 구조와 새 테이블의 구조가 서로 바뀐다.
본 절에서는 DBMS_REDEFINITION 패키지에서 제공하는 프러시저를 알파벳 순으로 설명한다.
온라인 테이블 재정의를 취소하는 프러시저이다. 이 프러시저에 원본 테이블과 새 테이블의 이름을 지정하면, 온라인 테이블을 재정의하기 위해 생성한 내부 객체는 제거되고 재정의가 취소된다. 이때 원본 테이블과 새 테이블은 취소 시점의 상태로 남는다.
ABORT_REDEF_TABLE 프러시저의 세부 내용은 다음과 같다.
프로토타입
PROCEDURE ABORT_REDEF_TABLE ( uname IN VARCHAR2, orig_table IN VARCHAR2, int_table IN VARCHAR2 );
파라미터
파라미터 | 설명 |
---|---|
uname | 원본 테이블과 새 테이블이 속한 스키마의 이름이다. |
orig_table | 원본 테이블의 이름이다. |
int_table | 새 테이블의 이름이다. |
예제
BEGIN
DBMS_REDEFINITION.ABORT_REDEF_TABLE('TIBERO', 'ORIG_TABLE', 'INT_TABLE');
END; /
온라인 테이블 재정의가 가능한지 확인하는 프러시저이다. 이 테이블에 테이블 이름과 옵션을 주면 온라인 테이블 재정의가 가능한지 확인한 후, 가능하지 않은 경우 에러를 발생시킨다.
CAN_REDEF_TABLE 프러시저의 세부 내용은 다음과 같다.
프로토타입
PROCEDURE CAN_REDEF_TABLE ( uname IN VARCHAR2, tname IN VARCHAR12, options_flag IN BINARY_INTEGER := 1, part_name IN VARCHAR2 := NULL );
파라미터
파라미터 | 설명 |
---|---|
uname | 테이블이 속한 스키마의 이름이다. |
tname | 온라인 테이블 재정의가 가능한지 확인할 테이블의 이름이다. |
options_flag | 원본 테이블에서 새 테이블로 데이터를 옮길 때 어떤 정보를 사용할 것인지를 지정한다.
|
part_name | 재정의할 파티션의 이름이다. 한 테이블의 단 하나의 파티션을 재정의하는 경우에는 파티션의 이름을 해당 파라미터로 명시해야 한다. NULL은 전체 테이블이 재정의된다는 것을 의미한다. |
예제
CREATE TABLE T1 (A NUMBER PRIMARY KEY);
BEGIN
DBMS_REDEFINITION.CAN_REDEF_TABLE('TIBERO', 'T1');
END; /
테이블을 온라인 재정의를 수행하면서, 테이블과 관련된 다른 객체들도 복사해주는 프러시저이다. 인덱스, 제약사항, 트리거, 권한 등에 대해서 기존 테이블의 관련 객체를 새 테이블에 복사해 줄지 파라미터로 명시 할 수 있다.
COPY_TABLE_DEPENDENTS 프러시저의 세부 내용은 다음과 같다.
프로토타입
PROCEDURE COPY_TABLE_DEPENDENTS ( uname IN VARCHAR2, orig_table IN VARCHAR2, int_table IN VARCHAR2, copy_indexes IN PLS_INTEGER := 1, copy_triggers IN BOOLEAN := TRUE, copy_constraints IN BOOLEAN := TRUE, copy_privileges IN BOOLEAN := TRUE, ignore_errors IN BOOLEAN := FALSE, num_errors OUT PLS_INTEGER, copy_statistics IN BOOLEAN := FALSE, copy_mvlog IN BOOLEAN := FALSE );
파라미터
파라미터 | 설명 |
---|---|
uname | 원본 테이블과 새 테이블이 속한 스키마의 이름이다. |
orig_table | 원본 테이블의 이름이다. |
int_table | 새 테이블의 이름이다. |
copy_indexes | 인덱스들도 복사해 줄 것인지 명시한다.
|
copy_triggers |
|
copy_constraints |
|
copy_privileges |
|
ignore_errors |
|
num_errors | 에러가 발생한 횟수를 담아 준다. |
copy_statistics | 테이블의 통계 정보를 복사한다. |
copy_mvlog | 테이블의 Materialized View LOG들을 복사한다. |
예제
CREATE TABLE T1 (A NUMBER PRIMARY KEY, B NUMBER); CREATE INDEX I1 ON T1(B); CREATE TABLE INT_T1 (A NUMBER, B NUMBER); BEGIN DBMS_REDEFINITION.START_REDEF_TABLE('TIBERO', 'T1', 'INT_T1', 'A A, B B'); END; / DECLARE num_errors pls_integer; BEGIN DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS('TIBERO', 'T1', 'INT_T1', DBMS_REDEFINITION.CONS_ORIG_PARAMS, TRUE, TRUE, TRUE, TRUE, num_errors, FALSE); END; /
온라인 테이블 재정의를 종료하는 프러시저이다. 이 프러시저에 원본 테이블과 새 테이블의 이름을 지정하면, 재정의 중에 변경된 데이터를 서로 교체한 후 원본 테이블과 새 테이블의 이름을 동기화한다. 이로써 재정의가 종료된다. 단, 시스템이 객체를 바꾸는 등의 작업을 하기 때문에 해당 테이블에서 수행되는 트랜잭션이 없는 경우에만 프러시저가 종료 작업을 수행한다.
FINISH_REDEF_TABLE 프러시저의 세부 내용은 다음과 같다.
프로토타입
PROCEDURE FINISH_REDEF_TABLE ( uname IN VARCHAR2, orig_table IN VARCHAR2, int_table IN VARCHAR2 );
파라미터
파라미터 | 설명 |
---|---|
uname | 원본 테이블과 새 테이블이 속한 스키마의 이름이다. |
orig_table | 원본 테이블의 이름이다. |
int_table | 새 테이블의 이름이다. |
예제
BEGIN
DBMS_REDEFINITION.FINISH_REDEF_TABLE('TIBERO', 'ORIG_TABLE', 'INT_TABLE');
END; /
기존 테이블의 관련 객체와 새 테이블의 관련 객체를 매핑시킨다. 온라인 테이블 재정의가 끝나면 매핑시킨 객체들의 이름이 서로 바뀌게 된다.
REGISTER_DEPENDENT_OBJECT 프러시저의 세부 내용은 다음과 같다.
프로토타입
PROCEDURE REGISTER_DEPENDENT_OBJECT ( uname IN VARCHAR2, orig_table IN VARCHAR2, int_table IN VARCHAR2, dep_type IN PLS_INTEGER, dep_owner IN VARCHAR2, dep_orig_name IN VARCHAR2, dep_int_name IN VARCHAR2 );
파라미터
파라미터 | 설명 |
---|---|
uname | 원본 테이블과 새 테이블이 속한 스키마의 이름이다. |
orig_table | 원본 테이블의 이름이다. |
int_table | 새 테이블의 이름이다. |
dep_type | 관련 객체의 타입이다. |
dep_owner | 관련 객체를 소유한 사용자 이름이다. |
dep_orig_name | 원본 테이블의 관련 객체 이름이다. |
dep_int_name | 새 테이블의 관련 객체 이름이다. |
예제
CREATE TABLE T1 (A NUMBER PRIMARY KEY, B NUMBER); CREATE INDEX I1 ON T1(B); CREATE TABLE INT_T1 (A NUMBER, B NUMBER); CREATE INDEX INT_I1 ON INT_T1(B); BEGIN DBMS_REDEFINITION.START_REDEF_TABLE('TIBERO', 'T1', 'INT_T1', 'A A, B B'); END; / BEGIN DBMS_REDEFINITION.REGISTER_DEPENDENT_OBJECT('TIBERO', 'T1', 'INT_T1', DBMS_REDEFINITION.CONS_INDEX, 'TIBERO', 'I1', 'INT_I1'); END; /
온라인 테이블 재정의를 시작하는 프러시저이다. 이 프러시저에 원본 테이블과 새 테이블의 이름 그리고 컬럼 대응 정보를 지정하면, 원본 테이블의 데이터를 새 테이블에 옮기기 시작한다.
여기서 새 테이블은 이 프러시저를 실행하기 전에 미리 생성해야 하며, 원본 테이블과 같은 스키마에 존재해야 한다. 단, 파티셔닝, 인덱스, 제약조건, 트리거와 같은 테이블의 구조와 관련된 객체는 원본 테이블과 같지 않아도 된다.
START_REDEF_TABLE 프러시저의 세부 내용은 다음과 같다.
프로토타입
PROCEDURE START_REDEF_TABLE ( uname IN VARCHAR2, orig_table IN VARCHAR2, int_table IN VARCHAR2, col_mapping IN VARCHAR2 DEFAULT NULL, options_flag IN BINARY_INTEGER DEFAULT cons_use_pk );
파라미터
파라미터 | 설명 |
---|---|
uname | 원본 테이블과 새 테이블이 속한 스키마의 이름이다. |
orig_table | 원본 테이블의 이름이다. |
int_table | 새 테이블의 이름이다. |
col_mapping | 원본 테이블과 새 테이블의 컬럼 대응 정보이다. |
options_flag | 원본 테이블에서 새 테이블로 데이터를 옮길 때 어떤 정보를 사용할 것인지를 지정한다.
|
예제
create table ORIG_TABLE ( PRODUCT_ID NUMBER primary key, PRODUCT_NAME VARCHAR2(20), PRICE NUMBER, SOLD_DATE DATE ); insert into ORIG_TABLE values (1, 'Tibero', 10000, SYSDATE); commit; create table INT_TABLE ( ID NUMBER primary key, NAME VARCHAR2(30), PRICE NUMBER(8,2), SOLD_DATE DATE ) partition by range (SOLD_DATE) ( partition P_2008 values less than ('2009-01-01'), partition P_2009 values less than (maxvalue) ); BEGIN DBMS_REDEFINITION.START_REDEF_TABLE('TIBERO', 'ORIG_TABLE', 'INT_TABLE', 'PRODUCT_ID ID, PRODUCT_NAME NAME, PRICE PRICE, SOLD_DATE SOLD_DATE'); END; /
원본 테이블과 새 테이블의 데이터를 동기화하는 프러시저이다. 물론 FINISH_REDEF_TABLE 프러시저를 실행해도 동기화가 되지만, 온라인 테이블을 재정의하는 중에 해당 테이블에 DML 문장이 많이 수행되는 경우라면 변경된 데이터를 한꺼번에 반영해야 하므로 처리 속도가 늦어질 수 있다. 또한, 재정의를 종료하는 동안에도 해당 테이블에 트랜잭션이 없어야 하기 때문에 DML 문장의 수행이 제한된다.
SYNC_INTERIM_TABLE 프러시저는 이러한 경우와는 다르게 재정의 중에도 동기화를 수행할 수 있으며, 재정의를 종료하는 시간을 줄일 수 있다.
SYNC_INTERIM_TABLE 프러시저의 세부 내용은 다음과 같다.
프로토타입
PROCEDURE SYNC_INTERIM_TABLE ( uname IN VARCHAR2, orig_table IN VARCHAR2, int_table IN VARCHAR2 );
파라미터
파라미터 | 설명 |
---|---|
uname | 원본 테이블과 새 테이블이 속한 스키마의 이름이다. |
orig_table | 원본 테이블의 이름이다. |
int_table | 새 테이블의 이름이다. |
예제
BEGIN
DBMS_REDEFINITION.SYNC_INTERIM_TABLE('TIBERO', 'ORIG_TABLE', 'INT_TABLE');
END; /
원본 테이블과 새 테이블 사이에 매핑되어 있는 관련 객체들의 정보를 해제한다.
UNREGISTER_DEPENDENT_OBJECT 프러시저의 세부 내용은 다음과 같다.
프로토타입
PROCEDURE UNREGISTER_DEPENDENT_OBJECT ( uname IN VARCHAR2, orig_table IN VARCHAR2, int_table IN VARCHAR2, dep_type IN PLS_INTEGER, dep_owner IN VARCHAR2, dep_orig_name IN VARCHAR2, dep_int_name IN VARCHAR2 );
파라미터
파라미터 | 설명 |
---|---|
uname | 원본 테이블과 새 테이블이 속한 스키마의 이름이다. |
orig_table | 원본 테이블의 이름이다. |
int_table | 새 테이블의 이름이다. |
dep_type | 관련 객체의 타입이다. |
dep_owner | 관련 객체를 소유한 사용자 이름이다. |
dep_orig_name | 원본 테이블의 관련 객체 이름이다. |
dep_int_name | 새 테이블의 관련 객체 이름이다. |
예제
CREATE TABLE T1 (A NUMBER PRIMARY KEY, B NUMBER); CREATE INDEX I1 ON T1(B); CREATE TABLE INT_T1 (A NUMBER, B NUMBER); CREATE INDEX INT_I1 ON INT_T1(B); BEGIN DBMS_REDEFINITION.START_REDEF_TABLE('TIBERO', 'T1', 'INT_T1', 'A A, B B'); END; / BEGIN DBMS_REDEFINITION.REGISTER_DEPENDENT_OBJECT('TIBERO', 'T1', 'INT_T1', DBMS_REDEFINITION.CONS_INDEX, 'TIBERO', 'I1', 'INT_I1'); END; / BEGIN DBMS_REDEFINITION.UNREGISTER_DEPENDENT_OBJECT('TIBERO', 'T1', 'INT_T1', DBMS_REDEFINITION.CONS_INDEX, 'TIBERO', 'I1', 'INT_I1'); END; /