기술 정보
home
채널 소개
home

Tibero Virtual Column 이관 방법

문서 유형
기술 정보
분야
마이그레이션
키워드
tbexport
tbimport
virtual column
table migrator
dblink
적용 제품 버전
6F

개요

Tibero에서 제공하는 Virtual Column 및 이관 방법에 대해 안내합니다.

Virtual Column

다른 컬럼 값 또는 다른 표현식을 사용하여 자동으로 값이 계산되는 가상 컬럼입니다. 다른 컬럼의 값을 이용해 새로운 값 생성에 사용합니다.
제약조건
DB에 저장되지 않고 실행 중에 계산되어 값을 반환합니다.
Update, Delete 조건절에는 사용 가능하지만 컬럼값 자체에 대한 변경은 불가능합니다.
가상 컬럼 Data를 직접 입력할 수 없습니다.

방법

참고
아래 환경에서 테스트를 진행하였습니다.
가상 머신 : Vitrual Box
OS : Centos7
Tibero : Tibero6 FS06 CS1902

Virtual Column 생성

COLUMN_NAME [DATATYPE] [GENERATED ALWAYS] AS [EXPRESSION] [VIRTUAL]
COLUMN_NAME : 가상 컬럼의 이름
DATATYPE : 가상 컬럼의 데이터 타입 (생략시 표현식 대한 데이터 유형을 사용)
AS EXPRESSION : 가상컬럼에 적용할 표현식
GENERATED ALWAYS, VIRTUAL : 해당 컬럼이 가상 컬럼임을 나타내는 구문으로 생략 가능
예시
CREATE TABLE EMP10 ( EMPNO NUMBER CONSTRAINTS PK_EMP10 PRIMARY KEY ENAME VARCHAR2(50), PAY NUMBER, ANNUAL_INCOME NUMBER GENERATED ALWAYS AS (PAY * 12) VIRTUAL );
SQL
복사

Virtual Column 확인

View : desc dba_tbl_columns SQL> desc dba_tbl_columns
COLUMN_NAME TYPE CONSTRAINT ------------------------------------------------------------------- OWNER VARCHAR(128) TABLE_NAME VARCHAR(128) COLUMN_NAME VARCHAR(128) DATA_TYPE VARCHAR(65532) DATA_TYPE_OWNER VARCHAR(128) DATA_LENGTH NUMBER DATA_PRECISION NUMBER DATA_SCALE NUMBER NULLABLE VARCHAR(1) COLUMN_ID NUMBER DATA_DEFAULT LONG --expression 확인 DEFAULT_LENGTH NUMBER CHAR_COL_DECL_LENGTH NUMBER CHAR_LENGTH NUMBER CHAR_USED VARCHAR(1) VIRTUAL_COLUMN VARCHAR(1) --virtual column 여부
SQL
복사
예시
create table tb_virtual (c1 number, c2 number, c3 number generated always as (c1 + c2) virtual); SQL> select table_name, column_name, data_type, data_default, virtual_column from dba_tbl_columns where virtual_column='Y'; TABLE_NAME COLUMN_NAM DATA_TYPE DATA_DEFAULT VIRTUAL_COLUMN ---------- ---------- ---------- -------------------- -------------------- TB_VIRTUAL C3 NUMBER ("C1" + "C2") Y 1 row selected.
SQL
복사

Virtual Column 이관

Virtual Column은 데이터를 직접 입력할 수 없는 컬럼이므로 데이터 이관시 TBR-8143: Cannot insert a value in a virtual column. 오류가 발생합니다. 단, CTAS를 통해 복제 테이블을 만드는 경우는 예외이며 일반적인 경우 아래의 방법으로 데이터 이관이 가능합니다.

tbexport, tbimport

Tibero에서 제공하는 유틸리티인 tbexport와 tbimport를 통해 virtual column을 가진 테이블 이관이 가능합니다.

DB link

DB link를 통해 이관시, Virtual Column을 제외한 나머지 컬럼들에 대해서만 select 후 insert 수행 시 정상적인 이관이 가능합니다.
예시
--테이블 생성 create table tb_virtual (c1 number, c2 number, c3 number generated always as (c1 + c2) virtual ); --디비링크를 통한 데이터 적재 insert /*+ append parallel(8) */ into tb_virtual (c1, c2) select /*+ parallel(8) */ c1, c2 from tb_virtual@link_t; commit;
SQL
복사

Tablemigrator

컬럼 순서 변경 기능이 제공되는 버전의 Tablemigrator를 통해 Virtual Column을 소유한 테이블의 데이터 이관이 가능합니다.
예시
--테이블 생성 create table tb_virtual (c1 number, c2 number, c3 number generated always as (c1 + c2) virtual ); --데이터 적재 insert into tb_virtual(c1, c2) values (10, 10); insert into tb_virtual(c1, c2) values (10, 10); insert into tb_virtual(c1, c2) values (10, 10); commit; --migrator.properties 설정 SOURCE_TYPE=DEFAULT SOURCE_DRIVER=com.m.internal.jdbc.MInternalDriver SOURCE_URL=jdbc:internal:thin:@localhost:8629:tibero SOURCE_USER=tibero SOURCE_PASSWORD=tmax SOURCE_SCHEMA=TIBERO SOURCE_TABLE=tb_virtual(c1, c2) TARGET_TYPE=TIBERO TARGET_DRIVER=com.m.internal.jdbc.MInternalDriver TARGET_URL=jdbc:internal:thin:@localhost:8629:tibero TARGET_USER=tibero TARGET_PASSWORD=tmax TARGET_SCHEMA=TIBERO TARGET_TABLE=tb_virtual(c1, c2) --테이블마이그레이터 수행 sh migrator.sh PROPERTY_FILE=migrator.properties --수행 결과 ## [WARNING] Ignored parameters: INSERT_THREAD_COUNT === Parameters === PROPERTY_FILE=migrator.properties SOURCE_TYPE=DEFAULT SOURCE_DRIVER=com.m.internal.jdbc.MInternalDriver SOURCE_URL=jdbc:internal:thin:@localhost:8629:tibero SOURCE_USER=tibero SOURCE_PASSWORD=************ SOURCE_SCHEMA=TIBERO SOURCE_SCHEMAORIGN=TIBERO SOURCE_TABLE=tb_virtual(c1, c2) SELECT_SUBPARTITION= TARGET_TYPE=DEFAULT TARGET_DRIVER=com.m.internal.jdbc.MInternalDriver TARGET_URL=jdbc:internal:thin:@localhost:8629:tibero TARGET_USER=tibero TARGET_PASSWORD=************ TARGET_SCHEMA=TIBERO TARGET_TABLE=tb_virtual(c1, c2) SELECT_FETCH_SIZE=1024 SELECT_AS_BYTE=N INSERT_BATCH=Y INSERT_PARALLEL=N INSERT_THREAD_COUNT=1 INSERT_ZERO_LENGTH_STRING_AS_NULL=Y ================== SOURCE_SCHEMA : TIBERO SOURCE_TABLE : tb_virtual(c1, c2) TARGET_SCHEMA : TIBERO TARGET_TABLE : tb_virtual(c1, c2) [E0]1674180265486 - STARTED [E0]1674180265490 - TOTAL Extracted ROWS: 3 (source schema = TIBERO, source table = tb_virtual) [L0]1674180265491 Loader started [L0]1674180265514 TOTAL Loaded ROWS: 3 (target schema = TIBERO, target table = tb_virtual) Loader finished [VERIFICATION] Source Info : TIBERO.tb_virtual : 3 Rows, Target Info : TIBERO.tb_virtual : 3 Rows [OK] Loading is ended. Elapsed Time (milliseconds) : 160 ADD BATCH : 6 EXECUTE BATCH : 0 --결과 확인 SQL> select * from tb_virtual; C1 C2 C3 ---------- ---------- ---------- 10 10 20 10 10 20 10 10 20 10 10 20 10 10 20 10 10 20 6 rows selected.
SQL
복사