> For the complete documentation index, see [llms.txt](https://docs.tibero.com/prosync/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.tibero.com/prosync/administration/apply/key-features/mapping/ddl-rule.md).

# DDL Rule

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

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

## 사용법 <a href="#undefined" id="undefined"></a>

{% code collapsedlinecount="10" %}

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

{% endcode %}

<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 %}

## 지원 DDL 종류 <a href="#ddl" id="ddl"></a>

다음은 설정 가능한 \[*DDL OPERATION*]과 \[*DDL OBJECT*]의 조합이다. Source DB가 **Tibero인 경우와 Oracle인 경우 동일하게 지원**한다.

* **O** : 지원
* **△** : 특정 조건에서만 지원 (비고 참조)
* **X** : 미지원

<table><thead><tr><th width="200">DDL OBJECT</th><th width="85">CREATE</th><th width="85">ALTER</th><th width="85">DROP</th><th>비고</th></tr></thead><tbody><tr><td>TABLE</td><td>O</td><td>O</td><td>O</td><td>TRUNCATE TABLE도 지원한다.</td></tr><tr><td>INDEX</td><td>O</td><td>O</td><td>O</td><td></td></tr><tr><td>VIEW</td><td>O</td><td>O</td><td>O</td><td></td></tr><tr><td>MATERIALIZED VIEW</td><td>O</td><td>△</td><td>O</td><td>ALTER MATERIALIZED VIEW는 추출·전달되며, Target DB가 Tibero인 경우에만 반영(apply) 단계에서 skip된다.</td></tr><tr><td>MATERIALIZED VIEW LOG</td><td>O</td><td>O</td><td>O</td><td></td></tr><tr><td>SEQUENCE</td><td>O</td><td>O</td><td>O</td><td></td></tr><tr><td>SYNONYM</td><td>O</td><td>X</td><td>O</td><td>PUBLIC SYNONYM도 SYNONYM과 동일한 종류로 처리된다.</td></tr><tr><td>PROCEDURE</td><td>O</td><td>O</td><td>O</td><td></td></tr><tr><td>FUNCTION</td><td>O</td><td>O</td><td>O</td><td></td></tr><tr><td>PACKAGE</td><td>O</td><td>O</td><td>O</td><td></td></tr><tr><td>PACKAGE BODY</td><td>O</td><td>O</td><td>O</td><td></td></tr><tr><td>TRIGGER</td><td>O</td><td>O</td><td>O</td><td></td></tr><tr><td>TYPE</td><td>O</td><td>O</td><td>O</td><td></td></tr><tr><td>TYPE BODY</td><td>O</td><td>O</td><td>O</td><td></td></tr><tr><td>USER</td><td>O</td><td>O</td><td>O</td><td></td></tr><tr><td>ROLE</td><td>△</td><td>△</td><td>△</td><td>스키마 비종속 객체로 INCLUDE ALL에서만 동기화된다. CREATE / ALTER는 비밀번호를 명시하지 않은 경우에만 지원한다.</td></tr><tr><td>TABLESPACE</td><td>△</td><td>△</td><td>△</td><td>스키마 비종속 객체로 INCLUDE ALL에서만 동기화된다. Target DB가 Oracle CDB-PDB 구성인 경우 아래 유의사항의 제약을 함께 확인한다.</td></tr><tr><td>DATABASE LINK</td><td>△</td><td>X</td><td>△</td><td>스키마 비종속 객체로 INCLUDE ALL에서만 동기화된다. PUBLIC DATABASE LINK도 DATABASE LINK와 동일한 종류로 처리된다.</td></tr><tr><td>DIRECTORY</td><td>△</td><td>X</td><td>△</td><td>스키마 비종속 객체로 INCLUDE ALL에서만 동기화된다.</td></tr><tr><td>LIBRARY</td><td>△</td><td>X</td><td>△</td><td>스키마 비종속 객체로 INCLUDE ALL에서만 동기화된다.</td></tr></tbody></table>

위 조합 외에 `COMMENT ON`과 `TRUNCATE TABLE`을 지원한다.

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

TYPE에는 위 표의 이름을 그대로 명시해야 한다. 예를 들어 Materialized View는 `TYPE=('CREATE MATERIALIZED VIEW')`와 같이 명시하며, `MVIEW`와 같은 약어는 인식되지 않는다.
{% endhint %}

### 지원하지 않는 DDL <a href="#ddl-1" id="ddl-1"></a>

다음 DDL은 동기화를 지원하지 않으며, 추출 단계에서 skip 처리된다.

* `GRANT`, `REVOKE`
* `RENAME` (`ALTER ... RENAME` 구문은 ALTER로 동기화 설정하여 사용할 수 있다.)
* `ALTER DATABASE LINK`, `ALTER PUBLIC DATABASE LINK`

#### 예제 <a href="#undefined-1" id="undefined-1"></a>

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

{% code collapsedlinecount="10" %}

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

{% endcode %}

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

{% code collapsedlinecount="10" %}

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

{% endcode %}

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

{% code collapsedlinecount="10" %}

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

{% endcode %}

### DDL 동기화 설정 시 유의사항 <a href="#ddl-2" id="ddl-2"></a>

* DDL 문장 크기\
  동기화할 DDL 문장의 각 요소는 128글자를 넘을 수 없다.
* 설정 전 확인\
  DDL 파라미터의 대상과, 동기화할 DDL 종류가 정확한지 Wildcard를 고려하여 확인하고 설정한다. 다른 DB나 대상에게 먼저 적용해보고 설정하는 것을 권장한다.
* CREATE TABLE 이후 동기화\
  CREATE TABLE에 대한 DDL 동기화 후 생성된 테이블을 DML 동기화 하려면 동기화 대상에 추가해야 한다. Admin 명령으로 수동 등록하거나 `AUTO_SYNC_ON_CREATE=Y`로 자동 등록할 수 있다. 반면 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 룰에 대한 설정 시 아래와 같은 형태로 명시한다.

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

  \
  **예시**

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

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

  CREATE ROLE, ALTER ROLE, CREATE \[PUBLIC] DATABASE LINK 등 비밀번호 정보가 포함될 수 있는 DDL 문장은 **비밀번호를 명시하지 않는 경우에만** DDL 동기화를 지원한다.
* Target Oracle CDB-PDB 환경의 TABLESPACE 동기화 제약사항

  ProSync는 DDL 문장을 Target DB 세션에서 그대로 수행하며, DATAFILE 경로를 Target DB 기준으로 변환하지 않는다. Target DB가 Oracle CDB-PDB 구성인 경우 TABLESPACE 관련 DDL은 다음 제약을 갖는다.

  * TABLESPACE는 Target 접속 정보(`TAR_DB_NAME`)가 가리키는 컨테이너에 생성된다. 접속 서비스가 PDB가 아닌 CDB(`CDB$ROOT`)를 가리키면 TABLESPACE도 CDB에 생성되므로, 동기화 대상 PDB의 서비스로 접속하도록 설정해야 한다.
  * DATAFILE을 파일명만(상대 경로) 명시한 DDL은 PDB 전용 디렉터리가 아니라 CDB와 모든 PDB가 공유하는 디렉터리(`$ORACLE_HOME/dbs`)에 데이터 파일을 생성한다. Target에 `DB_CREATE_FILE_DEST`가 설정되어 있는 경우에만 해당 위치에 PDB별로 생성된다. 공유 디렉터리에 생성되므로 다른 컨테이너가 같은 이름의 데이터 파일을 이미 사용 중이면 `ORA-01537`, 이전에 생성된 파일이 남아 있으면 `ORA-01119` / `ORA-27038`로 CREATE TABLESPACE가 실패한다. Source DB 기준의 절대 경로가 명시된 경우에도 Target에 동일한 경로가 없으면 실패한다.
  * CREATE TABLESPACE가 실패한 뒤 해당 TABLESPACE를 참조하는 CREATE TABLE이 동기화되면 `ORA-00959: tablespace ... does not exist`로 실패한다. 반영에 실패한 DDL은 기본 설정(`DISCARD_DDL_YN=N`)에서 계속 재시도되므로 이후 동기화가 진행되지 않는다. `DISCARD_DDL_YN=Y`로 설정하면 실패한 TABLESPACE DDL은 discard되지만, CREATE TABLE은 discard 대상이 아니므로 동일하게 재시도된다.

  따라서 Target이 CDB-PDB 구성인 환경에서는 Target PDB에 TABLESPACE를 미리 생성해 두고 DDL Rule에서 TABLESPACE 관련 DDL을 동기화 대상에서 제외하거나, Target에 `DB_CREATE_FILE_DEST`를 설정하여 데이터 파일이 PDB별 경로에 생성되도록 구성할 것을 권장한다.

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