MAP Rule
테이블, 컬럼 매핑 기능을 사용하기 위해서는 $PRS_HOME/config 디렉터리의 Apply config file인 '[INST_ID]_apply1.cfg'를 설정한다.
다음은 설정해야 할 파라미터에 대한 설명이다.
기본 MAP 파라미터에 Source DB의 특정 테이블을 Target DB의 특정 테이블로 동기화하기 위한 규칙을 설정한다.
MAP=([SYNC OPTION] SOURCE_USER.SOURCE_TABLE [SOURCE_COLUMNS]
[COLUMN FILTERING OPTION],
[TARGET_DATABASE.]TARGET_USER.TARGET_TABLE [TARGET_COLUMNS]
[RESOLVE OPTION] [SKIP OPTION]))
SYNC OPTION
TABLE : 동기화 할 테이블을 지정하는 경우 설정한다. OBJECT : 동기화 대상이 아닌 오브젝트의 DDL 매핑을 지정하는 경우 설정한다. EXCLUDE : 동기화를 제외할 테이블을 지정하는 경우 설정한다.
SOURCE_USER
동기화 할 Source DB 테이블의 사용자 이름을 설정한다.
SOURCE_TABLE
동기화 할 Source DB 테이블의 테이블 이름을 설정한다.
SOURCE_COLUMNS
동기화 할 Source DB 테이블의 컬럼들을 설정한다. (Column1, Column2, Column3과 같은 방식으로 설정한다.)
COLUMN FILTERING OPTION
동기화하지 않을 Source DB 테이블의 컬럼들을 설정한다.
TARGET_DATABASE
동기화시킬 Target DB의 데이터베이스 이름을 설정한다.
TARGET_USER
동기화시킬 Target DB 테이블의 사용자 이름을 설정한다.
TARGET_TABLE
동기화시킬 Target DB 테이블의 테이블 이름을 설정한다. 인자에 대한 자세한 내용은 각 절의 설명을 참고한다.
RESOLVE OPTION
동기화시킬 Target DB 테이블의 테이블 중 DCR Rule를 적용할 테이블의 이름을 설정한다. 인자에 대한 자세한 내용은 각 절의 설명을 참고한다.
SKIP OPTION
동기화 할 때 동기화를 하지 않을 row의 조건을 설정한다.
TARGET_COLUMNS
동기화시킬 Target DB 테이블의 컬럼들을 설정한다. SOURCE_COLUMNS와 순서대로 매핑되고 컬럼 개수는 일치해야 한다. (Column1, Column2, Column3)과 같은 방식으로 설정한다.
주의
다음 키워드는 MAP Rule 의 예약어이므로 table 등 대상을 명시하는 용도로 사용이 불가하다.
"ALL" "BY" "DEFAULT" "EXCEPT FOR" "EXCLUDE" "FILTER" "INCLUDE" "MAX" "MIN" "RESOLVE" "SOURCE" "SKIP" "SYNC" "TABLE" "TARGET" "TYPE" "OBJECT" "INSERT" "DELETE" "UPDATE"
다음은 MAP 파라미터를 이용해서 동기화 대상 반영 기능을 사용하는 방법에 대한 예제이다.
서로 다른 오너 / 다른 이름을 가진 테이블을 동기화
다음은 Source DB의 PROSYNC1 사용자의 T1 테이블을 Target DB의 PROSYNC2 사용자의 T2 테이블로 동기화하는 예제이다.
MAP=(TABLE PROSYNC1.T1, PROSYNC2.T2)
테이블의 특정 컬럼들만 동기화
다음은 Source DB의 PROSYNC1 사용자의 T1 테이블에 컬럼 C1, C2, C3가 있고, 이중 C1와 C2 컬럼만 Target DB의 PROSYNC2 사용자의 T2 테이블의 C1, C2 컬럼과 동기화하는 예제이다.
MAP=(TABLE PROSYNC1.T1(C1, C2), PROSYNC2.T2)
테이블간 컬럼 이름을 다르게 동기화
다음은 Source DB의 PROSYNC1 사용자의 T1 테이블에 컬럼 C1, C2, C3가 있고, 이중 C1와 C2 컬럼만 Target DB의 PROSYNC2 사용자의 T2 테이블의 D1, D2 컬럼과 동기화하는 예제이다.
MAP=(TABLE PROSYNC1.T1(C1, C2), PROSYNC2.T2(D1, D2))
SYNC OPTION
동기화 테이블을 사용할지 여부를 설정한다.
TABLE
동기화 테이블을 지정하는 경우 SYNC OPTION에 TABLE을 설정한다.
MAP=(TABLE [SOURCE_USER].[SOURCE_TABLE]... )
OBJECT
동기화 대상이 아닌 오브젝트의 DDL 매핑을 지정하는 경우 SYNC OPTION에 OBJECT를 설정한다.
MAP=(OBJECT [SOURCE_USER].[OBJECT_NAME], [TARGET_USER].[OBJECT_NAME])
동기화 대상 테이블에 대해서는 앞서 설명한 TABLE 규칙을 따라 DDL 매핑이 지원되며, TABLE 규칙이 명시되지 않은 경우 매핑 없이 동기화된다. 동기화 대상으로 설정할 수 없는 INDEX 등의 OBJECT나 동기화 대상이 아닌 테이블에 대해서만 해당 규칙으로 설정할 수 있다. OBJECT 규칙에 대해서는 반드시 위의 형태로만 사용 가능하다. OBJECT_NAME에 와일드 카드로 '%'를 입력할 수 있다. 이 경우 [SOURCE_USER]의 임의의 OBJECT [SOURCE_USER].[OBJECT_NAME]을 [TARGET_USER].[OBJECT_NAME]에 DDL 매핑하여 DDL을 동기화한다.
주의
DB 버전, 비표준 쿼리 등으로 인해 DDL의 OBJECT의 인식이 불가능할 수 있다. 따라서 MAP 파라미터를 사용해서 DDL 매핑을 할 때 TABLE과 OBJECT에 schema를 명시하는 것을 권장한다.
또한, 동기화 테이블 T1에 대해 DROP TABLE T1 실행 후 CREATE TABLE T1를 실행할 때 T1은 OBJECT로써 매핑될 것이고, 생성될 컬럼은 동기화 테이블 컬럼 MAP 파라미터에 영향을 받지 않는다.
EXCLUDE
동기화를 제외할 테이블을 지정하는 경우 SYNC OPTION에 EXCLUDE를 설정한다.
MAP=(EXCLUDE [SOURCE_USER].[SOURCE_TABLE]...)
예제
Source DB의 PROSYNC 사용자의 SKIP 테이블을 제외하고 동기화 할 때 다음과 같이 '[INST_ID]_apply1.cfg'의 MAP 파라미터를 설정한다.
MAP=(TABLE DEFAULT EXCLUDE PROSYNC.SKIP TABLE TIBERO.T1)
COLUMN FILTERING OPTION
COLUMN FILTERING OPTION을 사용하여 일부 컬럼에 대한 동기화를 제거할 수 있다. Constraint가 걸려있는 컬럼에 대해서는 해당 옵션을 사용할 수 없다.
다음과 같이 COLUMN FILTERING OPTION을 사용할 수 있다.
MAP=(... EXCEPT FOR ([COLUMN_NAME], ..., [COLUMN_NAME])...)
예제
Source DB의 PROSYNC1 사용자의 T1 테이블에 컬럼 C1, C2, C3가 있고, 이중 C1 컬럼만 제외하고 Target DB의 PROSYNC2 사용자의 T2 테이블의 C2, C3 컬럼과 동기화할 경우 다음과 같이 '[INST_ID]_apply1.cfg'의 MAP 파라미터를 설정한다.
MAP=(TABLE PROSYNC1.T1 EXCEPT FOR (C1), PROSYNC2.T2)
RESOLVE OPTION (a.k.a. Data Conflict Rule, DCR)
동기화 시 충돌 상황에서 Source DB에 정합성 기준을 맞출 지, Target DB에 정합성 기준을 맞출 지, 아니면 특정 컬럼의 Min 혹은 Max 값 기준으로 데이터 정합성을 맞출 지를 결정하는 옵션이다. 필수 옵션은 아니며 주로 양방향 동기화에 사용된다.
정해진 Rule에 따라 DML 들이 변경되거나 Skip 된다. 또한 상세한 설명은 문서의 성격상 Flow Control 에서 다룬다.
다음은 RESOLVE OPTION에 설정할 수 있는 RESOLVE_RULE의 종류와 설명이다.
MAP=(... RESOLVE BY [RESOLVE_RULE] ...)
SOURCE
Source 테이블의 Row를 우선으로 한다.
TARGET
Target 테이블의 Row를 우선으로 한다.
MAX(COLUMN_NAME)
해당 컬럼의 값이 더 큰 Row를 우선으로 한다.
반드시 DEFAULT OPTION을 설정해야 한다.
MIN(COLUMN_NAME)
해당 컬럼의 값이 더 작은 Row를 우선으로 한다.
반드시 DEFAULT OPTION을 설정해야 한다.
MAX와 MIN RESOLVE_RULE의 경우에는 반드시 DEFAULT OPTION을 설정해야 한다. 컬럼 값이 null인 경우에 설정한 DEFAULT 값으로 비교한다. 단, 동기화는 설정한 DEFAULT 값이 아니라 실제 컬럼 값으로 수행한다.
MAP=(... RESOLVE BY MAX(COLUMN_NAME) DEFAULT (COLUMN_VALUE) ...)
예제
UPDATE을 동기화하는 경우 MIN, MAX Rule을 사용한다면 비교 대상 컬럼의 변경 유무에 따라 다르게 비교를 수행한다. 비교 대상 컬럼이 변경되었다면 변경된 값, 변경되지 않았다면 기존 값으로 Target DB의 row와 비교를 진행한다. 비교 대상 컬럼이 NULL인 상태에서 UPDATE가 발생하는 경우 비교가 불가능하기 때문에 비교 없이 Source DB 값을 우선으로 DML을 수행한다.
예를 들어 DB1과 DB2간의 양방향 동기화하는 경우 DB1의 PROSYNC 사용자의 T1 테이블을 DB2의 PROSYNC 사용자의 T1 테이블로 동기화하고, column c3의 값이 더 큰 값을 우선하고자 하는 경우 마지막으로 INSERT할 때 DCR 컬럼인 c3에 null이 들어가는 경우 10으로 비교할 경우 다음과 같이 설정한다.
MAP=(TABLE PROSYNC.T1, PROSYNC.T1 RESOLVE BY MAX(c3) DEFAULT (10))
SKIP OPTION
SKIP OPTION에는 동기화하지 않길 원하는 row들을 특정하기 위한 조건을 설정한다.
지원컬럼타입
TIBERO
CHAR, VARCHAR, NUMBER, TIME, DATE, TIMESTAMP
ORACLE
CHAR, VARCHAR, NUMBER
지원비교조건
CHAR, VARCHAR
EQUAL (=), NOT_EQUAL (!=)
NUMBER, TIME, DATE, TIMESTAMP
EQUAL (=), NOT_EQUAL (!=), INEQUALITY (<, <=, >, >=)
SKIP OPTION은 다음과 같이 설정한다. SKIP_CONDITION이 True인 Row들은 동기화하지 않는다.
MAP=(... SKIP=(SKIP_CONDITION))
예제
Source DB의 PROSYNC 사용자의 T1 테이블을 Target DB의 PROSYNC 사용자의 T1 테이블로 동기화하고, column c1의 값이 'example'이 아니면 DML을 skip할 경우 다음과 같이 MAP 파라미터를 설정한다.
MAP=(TABLE PROSYNC.T1, PROSYNC.T1 SKIP=(c1!="example"))
위의 조건에 추가로 Source DB의 PROSYNC 사용자의 T2 테이블을 Target DB의 PROSYNC 사용자의 T2 테이블로 동기화하고, column c2의 값이 'example2'이면 DML을 skip할 경우 다음과 같이 MAP 파라미터를 설정한다.
MAP=(TABLE PROSYNC.T1, PROSYNC.T1 SKIP=(c1!="example")
TABLE PROSYNC.T2, PROSYNC.T2 SKIP=(c2="example2"))
Last updated