# DDL Rule

ProSync 사용자는 적용 프로세스의 설정 파일에서 DDL 파라미터를 설정할 수 있다. \
DDL 파라미터는 동기화 할 DDL에 대한 설정이다.&#x20;

DDL 파라미터는 하나 이상의 DDL Rule 문장으로 구성된다. \
DDL Rule에는 DDL 동기화를 포함/배제할 대상과 DDL 종류를 명시할 수 있다.

## 사용법

```
DDL=([SET] [RANGE], TYPE=('[DDL OPERATION] [DDL OBJECT]', ...))
```

<table><thead><tr><th width="170">항목</th><th>설명</th></tr></thead><tbody><tr><td>[SET]</td><td><p>INCLUDE 또는 EXCLUDE를 명시할 수 있다.<br></p><ul><li>INCLUDE: 기술된 규칙에 대해 동기화한다.</li><li>EXCLUDE: 기술된 규칙에 대해 동기화하지 않는다.<br>                     어떠한 INCLUDE보다 EXCLUDE를 우선시한다.</li></ul></td></tr><tr><td>[RANGE]</td><td><p>ALL 또는 DEFAULT 중 하나를 명시하거나, DB의 오브젝트 이름을 직접 명시할 수 있다.<br></p><ul><li>ALL: 모든 스키마, 테이블에 대해 적용된다.</li><li>DEFAULT: 모든 동기화 대상 테이블에 대해 적용된다.</li><li>오브젝트 이름을 직접 명시: 대상에 대해 적용된다.</li></ul></td></tr><tr><td>TYPE</td><td>TYPE은 하나 이상의 DDL OPERATION과 DDL OBJECT 쌍으로 구성된다.<br><br>지정되어 있지 않는 경우, Wildcard로 처리한다.</td></tr><tr><td>[DDL OPERATION]</td><td>Rule에 적용할 DDL 종류를 명시한다.</td></tr><tr><td>[DDL OBJECT]</td><td>Rule에 적용할 DDL 종류에 대한 대상을 명시한다.</td></tr></tbody></table>

{% hint style="info" %}
**참고**

\[*RANGE*]의 오브젝트 이름이나 \[*DDL OPERATION*], \[*DDL OBJECT*]에 %를 명시에 포함시켜 wildcard로 처리할 수 있다.

Source DB가 Oracle인 경우 \[*DDL OPERATION*]과 \[*DDL OBJECT*]에 '%'를 사용할 수 없다.
{% endhint %}

다음은 Source DB에 따라 설정 가능한 \[*DDL OPERATION*]과 \[*DDL OBJECT*]의 조합이다.

### Source DB가 Tibero인 경우

<table><thead><tr><th width="180" valign="top">DDL OPERATION	</th><th>DDL OBJECT</th></tr></thead><tbody><tr><td valign="top"><p>CREATE</p><p>ALTER</p><p>DROP</p><p>COMMENT ON</p></td><td><p>TABLE</p><p>INDEX</p><p>TRIGGER</p><p>SEQUENCE</p><p>VIEW</p><p>FUNCTION</p><p>PACKAGE</p><p>PACKAGE BODY</p><p>PROCEDURE</p><p>SYNONYM</p><p>PUBLIC SYNONYM</p></td></tr><tr><td valign="top">TRUNCATE</td><td>TABLE</td></tr></tbody></table>

### Source DB가 Oracle인 경우

<table><thead><tr><th width="180" valign="top">DDL OPERATION	</th><th>DDL OBJECT</th></tr></thead><tbody><tr><td valign="top">CREATE</td><td><p>TABLE</p><p>INDEX</p><p>TRIGGER</p><p>SEQUENCE</p><p>VIEW</p><p>MVIEW</p><p>FUNCTION</p><p>PACKAGE</p><p>PACKAGE BODY</p><p>PROCEDURE<br>SYNONYM</p><p>PUBLIC SYNONYM<br>TABLESPACE<br>DIRECTORY<br>MLOG</p><p><mark style="color:$warning;">ROLE</mark> (⚠ Password 포함 DDL 동기화 제약사항 참조)</p><p><mark style="color:$warning;">PUBLIC DATABASE LINK</mark> (⚠ Password 포함 DDL 동기화 제약사항 참조)</p><p>LIBRARY<br>TYPE<br>TYPEBODY</p></td></tr><tr><td valign="top">ALTER</td><td><p>TABLE</p><p>INDEX</p><p>TRIGGER</p><p>SEQUENCE</p><p>VIEW</p><p>MVIEW</p><p>FUNCTION</p><p>PACKAGE</p><p>PACKAGE BODY</p><p>PROCEDURE<br>SYNONYM</p><p>PUBLIC SYNONYM<br>TABLESPACE<br>DIRECTORY<br>MLOG</p><p><mark style="color:$warning;">ROLE</mark> (⚠ Password 포함 DDL 동기화 제약사항 참조)<br>TYPE<br>TYPEBODY</p></td></tr><tr><td valign="top">DROP</td><td><p>TABLE</p><p>INDEX</p><p>TRIGGER</p><p>SEQUENCE</p><p>VIEW</p><p>MVIEW</p><p>FUNCTION</p><p>PACKAGE</p><p>PACKAGE BODY</p><p>PROCEDURE</p><p>SYNONYM</p><p>PUBLIC SYNONYM<br>TABLESPACE<br>DIRECTORY<br>MLOG</p><p>ROLE</p><p>DATABASE LINK</p><p>PUBLIC DATABASE LINK<br>LIBRARY<br>TYPE<br>TYPEBODY</p></td></tr><tr><td valign="top">COMMENT ON</td><td>-</td></tr><tr><td valign="top">TRUNCATE</td><td>TABLE</td></tr></tbody></table>

#### 예제

다음은 모든 스키마에 대해서 모든 종류의 DDL 동기화를 하지만, 스키마 EXCLUDED\_USR의 모든 테이블에 대한 DDL 동기화는 배제하는 예제이다.

```
DDL=(
    INCLUDE ALL, TYPE=('%')
    EXCLUDE EXCLUDED_USR.%, TYPE=('%')
)
```

다음은 동기화 대상 테이블에 대해 TABLE을 대상으로 하는 DDL을 동기화하고, INCLUDED\_USR의 모든 오브젝트 이름에 대해 INDEX를 대상으로 하는 DDL을 동기화한다. \
반면, 오브젝트 이름이 EXCLUDED\_USR.IDX1일 경우 INDEX를 대상으로 하는 DDL을 동기화하지 않는다.

```
DDL=(
    INCLUDE DEFAULT, TYPE=('% TABLE')
    INCLUDE INCLUDED_USR.%, TYPE=('% INDEX')
    EXCLUDE EXCLUDED_USR.IDX1, TYPE=('% INDEX')
)
```

다음은 SRCUSR의 모든 테이블에 대해 TYPE에 해당되는 DDL을 동기화하지만, SRCUSR.T1에 대해서는 DROP TABLE과 CREATE TABLE에 해당되는 DDL을 동기화하지 않는다.&#x20;

```
DDL=(
    INCLUDE SRCUSR.%, TYPE=('DROP TABLE', 'ALTER TABLE', 'TRUNCATE TABLE')
    EXCLUDE SRCUSR.T1, TYPE=('DROP TABLE', 'CREATE TABLE')
)
```

### DDL 동기화 설정 시 유의사항

* DDL 문장 크기\
  동기화 할 DDL 문장의 각 요소는 128글자를 넘을 수 없다.
* 설정 전 확인\
  DDL 파라미터의 대상과, 동기화 할 DDL 종류가 정확한지 Wildcard를 고려하여 확인하고 설정한다. 다른 DB나 대상에게 먼저 적용해보고 설정하는 것을 권장한다.
* CREATE TABLE 이후 동기화\
  CREATE TABLE에 대한 DDL 동기화 후 생성된 테이블을 DML 동기화 하려면 수동으로 동기화 대상 추가를 해야한다. 반면 DDL은 Rule에 의해 생성된 직후부터 동기화 될 수 있으므로 주의한다.
* implicit DDL\
  CREATE TABLE에 대한 DDL 동기화 실행 중 컬럼의 PRIMARY KEY로 인해 INDEX 생성이 되는 것처럼 명시되지 않은 DDL을 implicit DDL이라 하며, 동기화 설정할 때 이를 주의한다.
* RENAME 지원\
  DDL 중 RENAME은 지원하지 않는다. ALTER ... RENAME을 이용한 DDL 구문은 ALTER를 동기화 설정하여 사용할 수 있다.
* ORACLE LOGMNR\
  Source DB가 Oracle, logmnr 를 사용할 때 동기화 대상에 대한 DDL 동기화만 지원한다.
* INDEX / CONSTRAINTS 관련 주의사항\
  INDEX / CONSTRAINTS의 경우 SRC/TAR DB에서 이름이 다를 경우 동기화가 불가능하다.
* DDL 설정 조합\
  복수 개의 DDL 룰에 대한 설정 시 아래와 같은 형태로 명시한다.

  ```
  DDL=([SET] [RANGE], TYPE=('[DDL OPERATION] [DDL OBJECT]', ...)
                  [SET] [RANGE], TYPE=('[DDL OPERATION] [DDL OBJECT]', ...) ....)
  ```
* OBJECT 동기화\
  DDL 동기화의 경우 INCLUDE DEFAULT 사용 시 오브젝트에 대한 DDL 동기화는 수행되지 않으며, 오브젝트에 대한 DDL 동기화 수행을 원하는 경우 직접 명시해야한다
* 스키마 미명시 DDL 구문의 동기화 제한\
  DDL 구문에서 대상 객체의 **스키마(Schema)** 가 명시되지 않은 경우, 해당 구문은 **동기화가 수행되지 않는다.**\
  따라서 **스키마를 명시한 형태의 DDL 구문으로 작성해야만** 동기화가 가능하다.

  \
  **예시**

  ```sql
  CREATE TABLE TEST_TABLE2 (
      c1 NUMBER,
      CONSTRAINT fk_test FOREIGN KEY (c1) REFERENCES [스키마명].TEST_TABLE1 (c1)
  );
  ```
* SYS 스키마 DDL 동기화 제약사항\
  스키마가 **SYS**인 경우, 해당 스키마를 대상으로 수행되는 모든 DDL은 동기화 시 **Skip** 처리된다.
* 스키마 비종속 객체(Non-Schema Object) 동기화 제약사항

  TABLESPACE, DIRECTORY, DATABASE LINK, ROLE, LIBRARY 객체는 특정 스키마에 종속되지 않는 객체로, DDL 동기화 시 **INCLUDE ALL** 옵션이 설정된 경우에만 동기화를 지원한다. \
  INCLUDE DEFAULT인 경우 동기화를 지원하지 않는다.&#x20;
* Password 포함 DDL 동기화 제약사항

  CREATE ROLE, ALTER ROLE, CREATE PUBLIC DATABASE LINK 등 비밀번호 정보가 포함될 수 있는 DDL 문장은 **비밀번호를 명시하지 않는 경우에만** DDL 동기화를 지원한다.

{% hint style="warning" %}
**주의**\
**DDL=(INCLUDE ALL, TYPE=('%'))**&#xC124;정 시, Source DB의 모든 스키마에서 수행되는 모든 타입의 DDL이 동기화된다. 동기화 대상 여부와 관계없이 모든 DDL이 적용되므로 사용 시 주의가 필요하다.\
추가적으로 INCLUDE ALL로 설정하는 경우 설치될 Instance 는 **단일 Instance** 로 구성되어야 한다.
{% endhint %}

###
