문서유형ㅣ기술정보
분야ㅣ마이그레이션
적용제품버전ㅣTibero 6 FS03 이상
문서번호ㅣTMITI020
개요
Tibero에서 제공하는 Virtual Column에 대해 소개하고 이관하는 방법을 안내합니다.
참고
본 문서는 기존 Tibero Virtual column 이관 방법 문서에서 실행부분 등 세부내용을 보완한 글 입니다.
기존 문서 바로가기 Tibero Virtual column 이관 방법
Virtual Column
정의
- Virtual Column이란 다른 컬럼 값 또는 다른 표현식을 사용하여 자동으로 값이 계산되는 가상 컬럼입니다.
- 다른 컬럼의 값을 이용해 새로운 값을 만들 필요가 있는 경우 사용됩니다.
- 오라클의 경우 11g 이상부터, 티베로의 경우 Tibero6 FS03 이후 버전부터 지원합니다.
제약조건
- DB에 저장되지 않고 실행 중에 계산되어 값을 반환합니다.
- Updata, Delete 조건절에 사용 가능하나 컬럼값 자체에 대한 변경은 불가능합니다.
(가상 컬럼 Data 직접 입력불가)
방법
Virtual Column 생성
|
COLUMN_NAME [DATATYPE] [GENERATED ALWAYS] AS [EXPRESSION] [VIRTUAL]
- COLUMN_NAME : 가상 컬럼의 이름 - DATATYPE : 가상 컬럼의 데이터 타입 (생략시 표현식 대한 데이터 유형을 사용) - AS EXPRESSION : 가상컬럼에 적용할 표현식 - GENERATED ALWAYS, VIRTUAL : 해당 컬럼이 가상 컬럼임을 나타내는 구문으로 생략 가능
EX) CREATE TABLE EMP10( EMPNO NUMBER CONSTRAINTS PK_EMP10 PRIMARY KEY, ENAME VARCHAR2(50), PAY NUMBER, ANNUAL_INCOME NUMBER GENERATED ALWAYS AS (PAY * 12) VIRTUAL ); |
Virtual Column 확인
다음의 View와 쿼리를 통해 확인 가능합니다.
|
View : desc dba_tbl_columns SQL> desc dba_tbl_columns
COLUMN_NAM 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 : select * from dba_tbl_columns where VIRTUAL_COLUMN='Y';
EX) 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_column where virtual_column='Y';
TABLE_NAME COLUMN_NAM DATA_TYPE DATA_DEFAULT VIRTUAL_COLUMN ---------- ---------- ---------- -------------------- -------------- TB_VIRTUAL C3 NUMBER ("C1" + "C2") Y |
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 Coulmn을 제외한 나머지 컬럼들에 대해서만 Select 후 Insert를 하면 정상적인 이관이 가능합니다.
|
EX) -- 테이블 생성 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; |
Tablemigrator
컬럼 순서 변경 기능이 제공되는 Tablemigrator를 통해서 Virtual Column을 소유한 테이블의 데이터 이관이 가능합니다.
참고
해당 기능은 테크넷에서 최신 T-UP 을 다운로드 해 사용이 가능합니다.
|
EX) -- 테이블 생성 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=sys SOURCE_PASSWORD=tibero 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=sys TARGET_PASSWORD=tibero 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=sys 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=sys 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 |