콘텐츠로 이동

부록 D. 기본값 매핑#

Altibase의 테이블 칼럼의 기본값은 원본 데이터베이스의 기본값과 대부분 호환된다.

하지만 이기종 데이터베이스들 간의 기본값 정책이 일부 상이하여, Migration Center가 이러한 몇 가지 예외 상황에 대해 원본 데이터베이스의 값을 Altibase 정책에 맞춰 변환한다.

이 부록은 Migration Center가 Altibase에 맞춰 원본 데이터베이스의 기본값을 변환하는 기본값 매핑 테이블을 제공한다.

기본값 매핑 테이블#

Migration Center는 데이터를 이전하기 전에 마이그레이션 대상 데이터베이스에 원본 데이터베이스의 테이블과 동일한 테이블을 생성한다. 이를 위해 원본 데이터베이스의 테이블 속성과 일치하는 테이블 생성 구문을 먼저 만든다. 이 때 Migration Center는 원본 테이블의 칼럼 기본값과 동일하게 대상 테이블의 칼럼에 기본값을 설정하려 한다. 이 절의 매핑 테이블에 나열된 기본값은 Migration Center가 CREATE TABLE 문 생성시에 표에 따라 변환하여 지정한다. 그 외의 기본값은 변경 없이 그대로 CREATE TABLE 문에 지정된다.

변경 없이 그대로 사용되는 기본값 중에는 원본과 대상 데이터베이스간에 호환이 되지 않는 것이 있을 수 있다. 필요하다면 나중에 사용자가 Reconcile 단계의 DDL Editing 창에서 직접 CREATE TABLE 문의 기본값을 수정해야 한다.

기본값 매핑 정책#

대다수의 원본 데이터베이스 기본값은 변경 없이 대상 데이터베이스와 호환된다. 하지만 아래의 경우에는 Migration Center가 원본 데이터베이스의 기본값을 대상 데이터베이스 정책에 맞춰 변환한다.

  • 문자형 데이터 타입의 기본값이 빈 문자열인 경우
    Altibase는 빈 문자열('')을 NULL로 인식하므로, 기본값을 지정하지 않는다. 다만 칼럼의 기본값이 빈 문자열이면서 NOT NULL 제약 조건도 설정한 칼럼의 경우 빈 문자열 처리 옵션 절의 내용을 참고한다.
  • 날짜형 데이터 타입의 기본값이 문자열 표현인 경우
    원본 데이터베이스 별로 날짜형을 위한 기본 포맷이 다르므로, Migration Center는 테이블 생성 구문에 기본값 대신에 DEFAULT 키워드가 포함된 주석을 지정한다. 필요하다면 나중에 사용자가 주석을 참고하여 직접 기본값을 설정해야 한다.
    단 원본 데이터베이스가 MySQL, TimesTen, 또는 CUBRID일 때, 아래의 표처럼 Migration Center가 기본값을 자동으로 변환한다.
  • 기본값에 함수가 사용된 경우
    아래 표에 열거된 함수가 원본 데이터베이스의 기본값으로 단독 사용된 경우에 한해서 표와 같이 변환된다. 그 외의 함수 또는 복잡한 형태의 표현식일 경우에는 변경 없이 그대로 변환된다. 필요하다면 나중에 사용자가 직접 변경해야 한다.

Oracle to Altibase#

Expression Type 원본(오라클)대상(Altibase)특이사항
문자형을 위한 문자열"
날짜형을 위한 문자열'97/04/21'/* DEFAULT '97/04/21' */
함수DBTIMEZONEDB_TIMEZONE()Altibase 6.3.1.0.0 이상에서 지원됨
SYS_GUID()SYS_GUID_STR()Altibase 6.3.1.0.0 이상에서 지원됨
UIDUSER_ID()
USERUSER_NAME()
Identity 칼럼Identity__SYS_table_name_column_name_SEQ.nextval
DEFAULT ON NULL 칼럼DEFAULT ON NULL 'test'DEFAULT 'test' NOT NULL

아래는 변환 예제이다.

오라클의 테이블 생성 SQL문 Altibase의 테이블 생성 SQL문
CREATE TABLE testtbl_4_defval
( c1 INT DEFAULT 123,
c2 VARCHAR(50) DEFAULT 'test',
c3 INT DEFAULT NULL,
c4 CHAR(10) DEFAULT '',
c5 INT DEFAULT SQRT(144) + 72,
c6 DATE DEFAULT '97/04/21',
c7 DATE DEFAULT TO_DATE('1999-12-01', 'YYYY-MM-DD'),
c8 VARCHAR(100) DEFAULT DBTIMEZONE,
c9 VARCHAR(100) DEFAULT SYS_GUID(),
c10 VARCHAR(100) DEFAULT UID,
c11 VARCHAR(100) DEFAULT USER,
c12 INT GENERATED BY DEFAULT AS IDENTITY,
c13 CHAR(5) DEFAULT ON NULL 'test' );
CREATE TABLE TESTTBL_4_DEFVAL
( C1 NUMBER (38, 0) DEFAULT 123,
C2 VARCHAR (50) DEFAULT 'test',
C3 NUMBER (38, 0),
C4 CHAR (10),
C5 NUMBER (38, 0) DEFAULT SQRT(144) + 72,
C6 DATE /* DEFAULT '97/04/21' */,
C7 DATE DEFAULT TO_DATE('1999-12-01', 'YYYY-MM-DD'),
C8 VARCHAR (100) DEFAULT DB_TIMEZONE(),
C9 VARCHAR (100) DEFAULT SYS_GUID_STR(),
C10 VARCHAR (100) DEFAULT USER_ID(),
C11 VARCHAR (100) DEFAULT USER_NAME(),
C12 NUMBER (38, 0) DEFAULT __SYS_TESTTBL_4_DEFVAL_C12_SEQ.NEXTVAL NOT NULL,
C13 CHAR (5) DEFAULT 'test' NOT NULL

MS-SQL Server to Altibase#

Expression Type 원본(MS-SQL Server)대상(Altibase)특이사항
문자형을 위한 문자열"
날짜형을 위한 문자열'December 5, 1985'/* DEFAULT 'December 5, 1985' */
함수GETDATE90SYSDATE
CURRENT_TIMESTAMP
LEN( str_expression )LENGTH( str_expression )

아래는 변환 예제이다.

MS-SQL Server의 테이블 생성 SQL문 Altibase의 테이블 생성 SQL문
CREATE TABLE testtbl_4_defval
( c1 BIT DEFAULT 0,
c2 INT DEFAULT 2 + 3,
c3 VARCHAR(50) DEFAULT 'test',
c4 INT DEFAULT NULL,
c5 NCHAR(10) DEFAULT '',
c6 FLOAT DEFAULT sqrt(12 * 12),
c7 DATE DEFAULT 'December 5, 1985',
c8 DATE DEFAULT getdate(),
c9 DATETIME DEFAULT CURRENT_TIMESTAMP,
c10 INT DEFAULT len('test'), );
CREATE TABLE TESTTBL_4_DEFVAL
( C1 CHAR (1) DEFAULT (0),
C2 INTEGER DEFAULT (2)+(3),
C3 VARCHAR (50) DEFAULT 'test',
C4 INTEGER,
C5 NCHAR (10),
C6 VARCHAR (310) DEFAULT sqrt((12)*(12)),
C7 DATE /* DEFAULT 'December 5, 1985' */,
C8 DATE DEFAULT SYSDATE,
C9 DATE DEFAULT SYSDATE,
C10 INTEGER DEFAULT LENGTH('test') );

MySQL to Altibase#

Expression Type 원본(MySQL)대상(Altibase)특이사항
문자형을 위한 문자열"
날짜형을 위한 문자열'1989-04-28'TO_DATE('1989-04-28', 'YYYY-MM-DD')
'1989-04-28 12:31:29'TO_DATE('1989-04-28 12:31:29', 'YYYY-MM-DD HH:MI:SS')
'0000-00-00 00:00:00'/* DEFAULT '0000-00-00 00:00:00' */MySQL은 날짜형 타입의 기본값이 지정되지 않으면 자동으로 '0000-00-00 00:00:00'으로 지정된다. 하지만 이 값은 Altibase의 DATE 타입에는 입력이 불가능한 값이므로 주석 처리가 된다.
함수CURRENT_TIMESTAMPSYSDATE
CURRENT_TIMESTAMP()
NOW()
LOCALTIME
LOCALTIME()
LOCALTIMESETAMP
LOCALTIMESETAMP()

MySQL은 테이블의 첫 칼럼의 데이터 타입이 TIMESTAMP인 경우, 사용자가 기본값을 지정하지 않아도 기본값으로 CURRENT_TIMESTAMP이 자동으로 지정된다. 따라서, 이 경우 기본값이 SYSDATE으로 변환된다. 아래의 예제를 참고하라.

아래는 변환 예제이다.

MySQL의 테이블 생성 SQL문 Altibase의 테이블 생성 SQL문
CREATE TABLE testtbl_4_defval
( c1 TIMESTAMP NOT NULL,
c2 INT DEFAULT 123,
c3 VARCHAR(50) DEFAULT 'test',
c4 INT DEFAULT NULL,
c5 CHAR(10) DEFAULT '',
c6 DATE DEFAULT '1989-04-28',
c7 DATETIME DEFAULT '1989-04-28 12:31:29',
c8 TIMESTAMP DEFAULT '1989-04-28 12:31:29' NOT NULL,
c9 TIMESTAMP NOT NULL );
CREATE TABLE TESTTBL_4_DEFVAL
( C1 DATE DEFAULT SYSDATE NOT NULL,
C2 INTEGER DEFAULT 123,
C3 CLOB DEFAULT 'test', C4 INTEGER,
C5 CHAR (10),
C6 DATE DEFAULT TO_DATE('1989-04-28', 'YYYY-MM-DD'),
C7 DATE DEFAULT TO_DATE('1989-04-28 12:31:29', 'YYYY-MM-DD HH:MI:SS'),
C8 DATE DEFAULT TO_DATE('1989-04-28 12:31:29', 'YYYY-MM-DD HH:MI:SS') NOT NULL,
C9 DATE /* DEFAULT '0000-00-00 00:00:00' */ NOT NULL );

Informix 11.5 to Altibase#

Expression Type 원본(Informix)대상(Altibase)특이사항
문자형을 위한 문자열"
날짜형을 위한 문자열'2007-03-06'/* DEFAULT '2007-03-06' */
함수CURRENTSYSDATE
TODAYSYSDATE

아래는 변환 예제이다.

Informix의 테이블 생성 SQL문 Altibase의 테이블 생성 SQL문
CREATE TABLE testtbl_4_defval (
c1 INTEGER DEFAULT 123,
c2 BOOLEAN DEFAULT 't',
c3 CHAR(100) DEFAULT 'test',
c4 INTEGER DEFAULT null,
c5 CHAR(10) DEFAULT '',
c6 DATETIME YEAR TO DAY DEFAULT DATETIME(07-3-6) YEAR TO DAY,
c7 DATETIME DAY TO HOUR DEFAULT CURRENT DAY TO HOUR,
c8 DATE DEFAULT TODAY );
CREATE TABLE TESTTBL_4_DEFVAL (
C1 INTEGER DEFAULT 123,
C2 CHAR (1) DEFAULT 't',
C3 CHAR (100) DEFAULT 'test',
C4 INTEGER,
C5 CHAR (10),
C6 DATE /* DEFAULT '2007-03-06' */,
C7 DATE DEFAULT SYSDATE,
C8 DATE DEFAULT SYSDATE );

TimesTen to Altibase#

Expression Type 원본(TimesTen)대상(Altibase)특이사항
날짜형을 위한 문자열'1989-04-28'TO_DATE('1989-04-28', 'YYYY-MM-DD')
'1989-04-28 12:31:29'TO_DATE('1989-04-28 12:31:29', 'YYYY-MM-DD HH:MI:SS')
'12:31:29' TO_DATE('12:31:29', 'HH:MI:SS')
함수UIDUSER_ID
USERUSER_NAME

아래는 변환 예제이다.

TimesTen의 테이블 생성 SQL문 Altibase의 테이블 생성 SQL문
CREATE TABLE testtbl_4_defval (
c1 INT DEFAULT 123,
c2 VARCHAR2(50) DEFAULT 'test',
c3 INT DEFAULT NULL,
c4 DATE DEFAULT '1999-12-01',
c5 TIMESTAMP DEFAULT '1999-12-01 11:30:21',
c6 TIME DEFAULT '11:30:21',
c7 VARCHAR(100) DEFAULT UID,
c8 VARCHAR(100) DEFAULT USER );
CREATE TABLE TESTTBL_4_DEFVAL (
c1 INT DEFAULT 123,
c2 VARCHAR2(50) DEFAULT 'test',
c3 INT DEFAULT NULL,
c4 DATE DEFAULT TO_DATE('1999-12-01', 'YYYY-MM-DD'),
c5 TIMESTAMP DEFAULT TO_DATE('1999-12-01 11:30:21', 'YYYY-MM-DD HH:MI:SS),
c6 TIME DEFAULT TO_DATE('11:30:21', 'HH:MI:SS'), c7 VARCHAR(100) DEFAULT UID,
c8 VARCHAR(100) DEFAULT USER );

CUBRID to Altibase#

Expression Type 원본(CUBRID)대상(Altibase)특이사항
함수USERUSER_ID()
CURRENT_USERUSER_NAME()

아래는 변환 예제이다.

CUBRID의 테이블 생성 SQL문 Altibase의 테이블 생성 SQL문
CREATE TABLE testtbl_4_defval (
c1 INTEGER DEFAULT 123,
c2 CHARACTER VARYING (50) DEFAULT 'test',
c3 INTEGER,
c4 CHARACTER VARYING (100) DEFAULT 'USER',
c5 CHARACTER VARYING (100) DEFAULT 'CURRENT_USER',
c6 CHARACTER VARYING(100) DEFAULT ' ',
c7 DATE DEFAULT DATE'2008-10-31',
c8 TIME DEFAULT TIME'1:15',
c9 TIMESTAMP DEFAULT TIMESTAMP'10/31',
c10 DATETIME DEFAULT DATETIME'01:15:45 PM 2008-10-31' );
CREATE TABLE TESTTBL_4_DEFVAL (
C1 INTEGER DEFAULT 123,
C2 VARCHAR (50) DEFAULT 'test',
C3 INTEGER,
C4 VARCHAR (100) DEFAULT USER_ID(),
C5 VARCHAR (100) DEFAULT USER_ID(),
C6 VARCHAR (100) DEFAULT ' ',
C7 DATE /* DEFAULT '10/31/2008' */,
C8 DATE /* DEFAULT '01:15:00 AM' */,
C9 DATE /* DEFAULT '12:00:00 AM 10/31/2016' */,
C10 DATE /* DEFAULT '01:15:45.000 PM 10/31/2008' */ );

Tibero to Altibase#

Expression Type 원본(Tibero)대상(Altibase)특이사항
문자형을 위한 문자열"
날짜형을 위한 문자열'97/04/21'/* DEFAULT '97/04/21' */
함수DBTIMEZONEDB_TIMEZONE()Altibase 6.3.1.0.0 이상에서 지원됨
SYS_GUID_GUID()SYS_GUID_STR()Altibase 6.3.1.0.0 이상에서 지원됨
UIDUSER_ID()
USERUSER_NAME()

아래는 변환 예제이다.

Tibero의 테이블 생성 SQL문 Altibase의 테이블 생성 SQL문
CREATE TABLE testtbl_4_defval(
c1 INT DEFAULT 123,
c2 VARCHAR(50) DEFAULT 'test',
c3 INT DEFAULT NULL,
c4 CHAR(10) DEFAULT '',
c5 INT DEFAULT QRT(144) + 72,
c6 DATE DEFAULT '97/04/21',
c7 DATE DEFAULT TO_DATE('1999-12-01', 'YYYY-MM-DD'),
c8 VARCHAR(100) DEFAULT DBTIMEZONE,
c9 VARCHAR(100) DEFAULT SYS_GUID(),
c10 VARCHAR(100) DEFAULT UID,
c11 VARCHAR(100) DEFAULT USER );
CREATE TABLE TESTTBL_4_DEFVAL(  
C1  NUMBER (38, 0)  DEFAULT 123,    
C2  VARCHAR (50)    DEFAULT 'test',    
C3  NUMBER (38, 0),    
C4  CHAR (10),    
C5  NUMBER (38, 0)  DEFAULT SQRT(144) + 72,   
C6  DATE /* DEFAULT '97/04/21' */,    
C7  DATE DEFAULT TO_DATE('1999-12-01', 'YYYY-MM-DD'),    
C8  VARCHAR (100)   DEFAULT DB_TIMEZONE(),    
C9  VARCHAR (100)   DEFAULT SYS_GUID_STR(),
C10 VARCHAR (100)   DEFAULT USER_ID(),
C11 VARCHAR (100)   DEFAULT USER_NAME() );

PostgreSQL to Altibase#

Expression Type 원본(PostgreSQL)대상(Altibase)특이사항
함수current_roleUSER_NAME()
current_schemaUSER_NAME()
current_userUSER_NAME()
session_userUSER_NAME()
userUSER_NAME()
ceiling(expression)CEIL(number)
random()RANDOM(0)/2147483647
bit_length(string)8*OCTET_LENGTH(expr)
reverse(str)REVERSE_STR(expr)
strpos(string, substring)INSTR (expr, substring)
clock_timestamp()SYSDATE
current_dateSYSDATE
current_timeSYSDATE
current_timestampSYSDATE
localtimeSYSDATE
localtimestampSYSDATE
now()SYSDATE
statement_timestamp()SYSDATE
transaction_timestamp()SYSDATE

아래는 변환 예제이다.

PostgreSQL의 테이블 생성 SQL문 Altibase의 테이블 생성 SQL문
CREATE TABLE testtbl_4_defval
( c1 VARCHAR(50) DEFAULT current_role,
c2 VARCHAR(50) DEFAULT current_schema,
c3 VARCHAR(50) DEFAULT current_user,
c4 VARCHAR(50) DEFAULT session_user,
c5 VARCHAR(50) DEFAULT user,
c6 INTEGER DEFAULT ceiling(-95.3),
c7 DOUBLE PRECISION DEFAULT random(),
c8 INTEGER DEFAULT bit_length('abc'),
c9 VARCHAR(50) DEFAULT reverse('reverse'),
c10 INTEGER DEFAULT strpos('high', 'ig'),
c11 timestamp with time zone DEFAULT clock_timestamp(),
c12 date DEFAULT current_date,
c13 time with time zone DEFAULT current_time,
c14 timestamp with time zone DEFAULT current_timestamp,
c15 time DEFAULT localtime,
c16 timestamp DEFAULT localtimestamp,
c17 timestamp with time zone DEFAULT now(),
c18 timestamp with time zone DEFAULT transaction_timestamp() );
CREATE TABLE TESTTBL_4_DEFVAL
( C1 VARCHAR (50) DEFAULT USER_NAME()
,C2 VARCHAR (50) DEFAULT USER_NAME()
,C3 VARCHAR (50) DEFAULT USER_NAME()
,C4 VARCHAR (50) DEFAULT USER_NAME()
,C5 VARCHAR (50) DEFAULT USER_NAME()
,C6 INTEGER DEFAULT CEIL('-95.3')
,C7 DOUBLE DEFAULT (RANDOM(0)/2147483647)
,C8 INTEGER DEFAULT 8*OCTET_LENGTH('abc')
,C9 VARCHAR (50) DEFAULT REVERSE_STR('reverse')
,C10 INTEGER DEFAULT INSTR('high', 'ig')
,C11 DATE DEFAULT SYSDATE
,C12 DATE DEFAULT SYSDATE
,C13 DATE DEFAULT SYSDATE
,C14 DATE DEFAULT SYSDATE
,C15 DATE DEFAULT SYSDATE
,C16 DATE DEFAULT SYSDATE
,C17 DATE DEFAULT SYSDATE
,C18 DATE DEFAULT SYSDATE );


기본값으로 설정된 빈 문자열#

각 데이터베이스마다 빈 문자열을 처리하는 방법은 다음과 같다.

데이터베이스 CHAR VARCHAR
Oracle NULL NULL
MySQL 빈 문자열 빈 문자열
SQL Server 고정 길이 문자열 빈 문자열
PostgreSQL 고정 길이 문자열 빈 문자열
CUBRID 고정 길이 문자열 빈 문자열
Informix 고정 길이 문자열 빈 문자열

Altibase는 기본적으로 빈 문자열을 NULL로 처리한다. 즉, 원본 데이터베이스에 빈 문자열 데이터가 있다면 마이그레이션 시 NULL 처리한다. 만약 빈 문자열이 칼럼의 기본값으로 설정되었다면(DEFAULT ''), Altibase는 이를 DEFAULT NULL로 해석하고, 기존의 기본값 설정을 제거한다.

그러나 기본값이 빈 문자열이면서 NOT NULL 제약 조건이 설정된 칼럼이 있다면 Altibase로 마이그레이션 시 빈 문자열이 NULL로 간주되어 NOT NULL 제약 조건과 충돌하게 된다. 이러한 충돌로 인한 데이터 유실을 방지하기 위해, Migration Center는 빈 문자열 기본값을 사용자 정의값으로 변경하거나 NOT NULL 제약 조건을 조정하는 옵션을 제공한다.

Altibase는 고정 길이의 공백으로 구성된 문자열과 NULL을 빈 문자열과 구분한다. 따라서, 위 표에서 빈 문자열로 표시된 항목만 마이그레이션 시 빈 문자열 처리 옵션의 영향을 받는다.

빈 문자열 처리 옵션#

Migration Center에서는 데이터 유실을 방지하기 위해 빈 문자열 처리 옵션을 제공한다. 이 옵션은 메뉴 Migration > Migration Options 경로를 통해 설정할 수 있다.

Object Options#

다음은 Object Options 에서 설정할 수 있는 빈 문자열 처리 옵션이다.

아래의 옵션을 설정하여 빈 문자열이 기본값이고 NOT NULL 제약 조건이 설정된 칼럼 테이블을 마이그레이션할 때 생성할 CREATE 문을 조정할 수 있다.

Object Options의 빈 문자열 처리 옵션은 빈 문자열 데이터를 직접 처리하지는 않는다. 만약 빈 문자열 데이터를 변경하고 싶다면 Data Options의 빈 문자열 처리 옵션을 설정해야 한다.

옵션 설명 참고
Replace Default Empty String Altibase에서 생성하는 CREATE 문에서 사용자가 정의한 문자열로 기본값을 대체할지 여부를 설정한다.
Replacement Default Value 빈 문자열을 대체할 기본값을 입력한다. Replace Default Empty String이 Yes일 때 활성화된다.
Remove Not Null Altibase에서 생성하는 CREATE 문에서 NOT NULL 제약 조건을 해제한다.

이 옵션들은 개별적으로 또는 동시에 적용할 수 있으며, 사용자 요구에 따라 빈 문자열 처리 방식을 유연하게 조정할 수 있다. 예를 들어, 원본 데이터베이스 테이블의 칼럼 정의가 C1 CHAR(10) DEFAULT '' NOT NULL일 때, 옵션 조합에 따라 생성되는 구문은 다음과 같다.

Replace Default Empty String Replacement Default Value Remove Not Null 칼럼 정의
Yes EMPTY_STRING Yes C1 CHAR(10) DEFAULT 'EMPTY_STRING'
EMPTY_STRING No C1 CHAR(10) DEFAULT 'EMPTY_STRING' NOT NULL
No N/A Yes C1 CHAR(10)
N/A No C1 CHAR(10) NOT NULL

Data Options#

다음은 Data Options 에서 설정할 수 있는 빈 문자열 처리 옵션이다.

아래의 옵션을 설정하여 데이터 마이그레이션 중 발견된 빈 문자열을 사용자가 정의한 값으로 변경할 수 있다.

옵션 설명 참고
Replace Empty Strings in Not Null NOT NULL 제약 조건이 설정된 칼럼의 빈 문자열을 사용자가 정의한 문자열로 대체할지 여부를 설정한다.
Replacement String 빈 문자열을 대체할 문자열을 입력한다. Replace Empty Strings in Not Null이 Yes일 때 만 활성화된다.
Apply to Nullable Columns NOT NULL 제약 조건이 걸려있지 않은 칼럼의 빈 문자열 데이터도 Replacement String에 입력한 문자열로 같이 변경할지 여부를 설정한다. Replace Empty Strings in Not Null이 Yes일 때만 활성화된다.