> For the complete documentation index, see [llms.txt](https://docs.tibero.com/tibero-manuals/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/tibero-manuals/7.2.6.manuals/sql-reference-guide/data-definition-language/create-trigger.md).

# CREATE TRIGGER

데이터베이스 트리거를 생성합니다. 트리거는 테이블, 스키마, 데이터베이스와 연결된 tbPSM 블록입니다.

트리거는 활성화 상태로 생성되며, 생성 후 **ALTER TRIGGER** 문 또는 **ALTER TABLE** 문을 사용해 활성화 또는 비활성화 상태를 변경할 수 있습니다. 트리거가 활성화된 상태에서는 주어진 조건이 만족되는 순간 트리거 내용이 수행됩니다.

트리거에 컴파일 에러가 발생하면 트리거는 생성되지만 실행되지는 않습니다. 결과적으로 트리거가 비활성화 상태로 바뀌거나, 컴파일 에러가 없는 버전으로 교체되거나, 트리거가 삭제되기 전까지는 트리거 조건을 만족하는 모든 DML 문장이 블록되는 상태가 됩니다.

**CREATE TRIGGER**의 세부 내용은 다음과 같습니다.

* **문법**

<figure><img src="https://content.gitbook.com/content/evqs7Ne3nMyXQFkBSQWR/blobs/31c5s8LsZMqoJnodUm1E/input_create_trigger.svg" alt=""><figcaption></figcaption></figure>

<div align="left"><figure><img src="https://content.gitbook.com/content/evqs7Ne3nMyXQFkBSQWR/blobs/JwH7nhzFItp9yhDGGnvx/image.png" alt=""><figcaption></figcaption></figure></div>

<div align="left"><figure><img src="https://content.gitbook.com/content/evqs7Ne3nMyXQFkBSQWR/blobs/GoulRWYfMmLKN06gKv1W/image.png" alt=""><figcaption></figcaption></figure></div>

<div align="left"><figure><img src="https://content.gitbook.com/content/evqs7Ne3nMyXQFkBSQWR/blobs/mCnRXN6jWV8PvGjjWjAQ/image.png" alt=""><figcaption></figcaption></figure></div>

<div align="left"><figure><img src="https://content.gitbook.com/content/evqs7Ne3nMyXQFkBSQWR/blobs/WU7Ut9kQOmmHJHDvylmv/image.png" alt=""><figcaption></figcaption></figure></div>

<div align="left"><figure><img src="https://content.gitbook.com/content/evqs7Ne3nMyXQFkBSQWR/blobs/9Eejt8mwWw1uabH1DwZS/image.png" alt=""><figcaption></figcaption></figure></div>

<div align="left"><figure><img src="https://content.gitbook.com/content/evqs7Ne3nMyXQFkBSQWR/blobs/bX993QZC8y3fQvIqYUpj/image.png" alt=""><figcaption></figcaption></figure></div>

<div align="left"><figure><img src="https://content.gitbook.com/content/evqs7Ne3nMyXQFkBSQWR/blobs/UD1oOIvODO5BkYrX0yKw/image.png" alt=""><figcaption></figcaption></figure></div>

<div align="left"><figure><img src="https://content.gitbook.com/content/evqs7Ne3nMyXQFkBSQWR/blobs/P2p7qT83yD1mhjyVlilH/image.png" alt=""><figcaption></figcaption></figure></div>

* **특권**
  * `CREATE TRIGGER` 시스템 특권이 있으면 사용자가 소유한 스키마에 트리거를 생성할 수 있습니다.
  * `CREATE ANY TRIGGER` 시스템 특권이 있으면 다른 사용자가 소유한 스키마에 트리거를 생성할 수 있습니다.
  * 데이터베이스에 연결되는 트리거를 생성하는 데는 `ADMINISTER DATABASE TRIGGER` 시스템 특권을 사용합니다.
  * 트리거가 SQL 문장을 수행하거나 프러시저 또는 함수를 호출할 때는 트리거 소유자에게 해당 작업을 수행할 수 있는 특권이 있어야 합니다.
* **구성요소**

– create\_trigger

<table><thead><tr><th width="182.888916015625">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>OR REPLACE</td><td>이미 존재하는 트리거의 내용을 변경할 때 명시</td></tr><tr><td>IF NOT EXISTS</td><td><ul><li>객체가 이미 존재해도 오류를 발생시키지 않고 성공 메시지를 반환</li><li>객체가 존재하지 않으면 기존 CREATE 문과 동일하게 동작</li><li><code>OR REPLACE</code>와 같이 사용할 수 없음</li></ul></td></tr><tr><td>execute_type</td><td>트리거가 실행될 시점을 명시</td></tr><tr><td>BEFORE</td><td><ul><li>이벤트가 수행되기 전에 트리거를 먼저 수행</li><li>로우 트리거의 경우 해당 로우가 변경되기 전에 수행됨</li></ul></td></tr><tr><td>AFTER</td><td><ul><li>이벤트가 수행된 후 트리거를 수행</li><li>로우 트리거의 경우 해당 로우가 변경된 후 수행됨</li></ul></td></tr><tr><td>INSTEAD OF</td><td><ul><li>원래 작업 대신 트리거를 수행</li><li>뷰에 대한 DML 이벤트에서만 사용할 수 있으며, 테이블 DML 이벤트 또는 DDL, DB 이벤트에서는 사용할 수 없음</li></ul></td></tr><tr><td>FOR</td><td><ul><li>트리거를 컴파운드 트리거(compound trigger)로 만듦</li><li>트리거 본문을 <code>COMPOUND TRIGGER ... END;</code> 형태로 작성하며, DML 이벤트에서만 사용할 수 있음</li></ul></td></tr><tr><td>dml_event_clause</td><td><ul><li>트리거를 DML 이벤트 트리거로 만듦</li><li>지정한 DML 문장이 실행될 때마다 트리거가 수행됨</li></ul></td></tr><tr><td>ddl_db_event_clause</td><td><ul><li>트리거를 DDL 또는 DB 이벤트 트리거로 만듦</li><li>지정한 DDL 문장 또는 DB 이벤트가 실행될 때마다 트리거가 수행됨</li></ul></td></tr><tr><td>FOLLOWS trigger_name</td><td><ul><li>현재 트리거를 지정한 트리거 뒤에 실행하도록 지정</li><li>지정하지 않으면 트리거는 생성된 순서대로 실행됨</li></ul></td></tr><tr><td>enable_option</td><td><ul><li>트리거 활성화 여부를 지정</li><li><code>ENABLE</code> 또는 <code>DISABLE</code>을 사용할 수 있으며, 기본값은 <code>ENABLE</code></li></ul></td></tr><tr><td>WHEN condition_expression</td><td><ul><li>트리거가 동작할 조건을 명시</li><li>조건이 만족되기 전까지는 데이터베이스가 트리거를 동작시키지 않음</li></ul></td></tr><tr><td>psm_source</td><td><ul><li>트리거가 동작할 때 수행할 프러시저를 명시</li><li>tbPSM 블록을 직접 명시하는 방식</li></ul></td></tr><tr><td>call_spec</td><td><ul><li>트리거가 동작할 때 수행할 프러시저를 명시</li><li><strong>CALL</strong> 문을 사용해 저장된 프러시저를 호출</li><li>자세한 내용은 <strong>CALL</strong> 문을 참고</li></ul></td></tr></tbody></table>

`execute_type`에 `FOR`를 명시하면 컴파운드 트리거가 되며, 하나의 트리거 안에 실행 시점별 섹션을 함께 작성합니다. 컴파운드 트리거 본문의 구성과 실행 순서는 "[Tibero tbPSM 안내서](/tibero-manuals/7.2.6.manuals/tbpsm-guide.md)"의 [트리거](/tibero-manuals/7.2.6.manuals/tbpsm-guide/trigger.md)를 참고합니다.

– dml\_event\_clause

<table><thead><tr><th width="227.333251953125">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>dml_event_type</td><td><code>dml_event_type</code>에 설정된 DML 문장이 실행될 때마다 트리거가 수행되도록 설정</td></tr><tr><td>ON schema</td><td><ul><li>생성된 트리거가 연결될 스키마를 명시</li><li>생략하면 현재 사용자의 스키마로 인식됨</li></ul></td></tr><tr><td>object_name</td><td>트리거를 연결할 객체 이름을 명시</td></tr><tr><td>REFERENCING reference_clause</td><td><ul><li>트리거에서 현재 로우 값에 접근하는 방법을 지정</li><li>기존 값은 <code>OLD</code>, 새 값은 <code>NEW</code>로 접근</li><li>필요하면 <code>NEW</code>, <code>OLD</code> 대신 다른 이름을 지정할 수 있음</li><li>예: <code>:OLD.A := 1;</code></li></ul></td></tr><tr><td>FOR EACH ROW</td><td><ul><li><code>FOR EACH ROW</code>를 명시하면 로우 트리거가 됨</li><li>트리거 이벤트에 영향을 받는 각 로우마다 트리거를 수행</li><li>이 절을 생략하면 문 단위 트리거가 됨</li><li>트리거 이벤트를 발생시키는 SQL 문장이 수행되면 트리거는 한 번만 수행됨</li></ul></td></tr></tbody></table>

– dml\_event\_type

<table><thead><tr><th width="176.66668701171875">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>DELETE</td><td>테이블에서 DELETE 문이 수행되어 로우가 삭제될 때마다 트리거가 수행됨</td></tr><tr><td>INSERT</td><td>테이블에 INSERT 문이 수행되어 로우가 추가될 때마다 트리거가 수행됨</td></tr><tr><td>UPDATE</td><td>테이블에 저장된 값이 변경될 때마다 트리거가 수행됨</td></tr><tr><td>UPDATE OF</td><td>OF에 명시된 컬럼의 값이 변경될 때마다 트리거를 수행</td></tr></tbody></table>

– reference\_clause

<table><thead><tr><th width="166">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>OLD</td><td>테이블 로우의 기존 값에 접근할 때 사용</td></tr><tr><td>NEW</td><td>테이블 로우의 새 값에 접근할 때 사용</td></tr><tr><td>AS identifier</td><td><code>OLD</code>, <code>NEW</code> 대신 다른 이름을 사용할 때 지정</td></tr></tbody></table>

– ddl\_db\_event\_clause

<table><thead><tr><th width="167.77777099609375">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>event</td><td>DDL 또는 DB 이벤트를 명시</td></tr><tr><td>on_type</td><td><ul><li>DDL 또는 DB 이벤트가 발생한 대상을 명시</li><li><code>SCHEMA</code> 또는 <code>DATABASE</code>를 지정</li></ul></td></tr></tbody></table>

– ddl\_or\_db\_event

<table><thead><tr><th width="227.3333740234375">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>ALTER</td><td><code>ALTER</code> DDL이 발생할 때 트리거가 수행됨</td></tr><tr><td>ANALYZE</td><td><code>ANALYZE</code> DDL이 발생할 때 트리거가 수행됨</td></tr><tr><td>ASSOCIATE STATISTICS</td><td><code>ASSOCIATE STATISTICS</code> DDL이 발생할 때 트리거가 수행됨</td></tr><tr><td>AUDIT</td><td><code>AUDIT</code> DDL이 발생할 때 트리거가 수행됨</td></tr><tr><td>COMMENT</td><td><code>COMMENT</code> DDL이 발생할 때 트리거가 수행됨</td></tr><tr><td>CREATE</td><td><code>CREATE</code> DDL이 발생할 때 트리거가 수행됨</td></tr><tr><td>DISASSOCIATE STATISTICS</td><td><code>DISASSOCIATE STATISTICS</code> DDL이 발생할 때 트리거가 수행됨</td></tr><tr><td>DROP</td><td><code>DROP</code> DDL이 발생할 때 트리거가 수행됨</td></tr><tr><td>GRANT</td><td><code>GRANT</code> DDL이 발생할 때 트리거가 수행됨</td></tr><tr><td>NOAUDIT</td><td><code>NOAUDIT</code> DDL이 발생할 때 트리거가 수행됨</td></tr><tr><td>RENAME</td><td><code>RENAME</code> DDL이 발생할 때 트리거가 수행됨</td></tr><tr><td>REVOKE</td><td><code>REVOKE</code> DDL이 발생할 때 트리거가 수행됨</td></tr><tr><td>TRUNCATE</td><td><code>TRUNCATE</code> DDL이 발생할 때 트리거가 수행됨</td></tr><tr><td>DDL</td><td>모든 DDL이 발생할 때 트리거가 수행됨</td></tr><tr><td>SERVERERROR</td><td><code>SERVERERROR</code> 이벤트가 발생할 때 트리거가 수행됨</td></tr><tr><td>LOGON</td><td><code>LOGON</code> 이벤트가 발생할 때 트리거가 수행됨</td></tr><tr><td>LOGOFF</td><td><code>LOGOFF</code> 이벤트가 발생할 때 트리거가 수행됨</td></tr><tr><td>STARTUP</td><td><code>STARTUP</code> 이벤트가 발생할 때 트리거가 수행됨</td></tr><tr><td>SHUTDOWN</td><td><code>SHUTDOWN</code> 이벤트가 발생할 때 트리거가 수행됨</td></tr><tr><td>SUSPEND</td><td><code>SUSPEND</code> 이벤트가 발생할 때 트리거가 수행됨</td></tr></tbody></table>

* **예제**

다음은 **CREATE TRIGGER** 문을 사용해 트리거를 생성하는 예입니다.

```sql
CREATE TABLE tbl2 (ID NUMBER PRIMARY KEY);
CREATE TABLE tbl3 (ID NUMBER PRIMARY KEY);
CREATE OR REPLACE TRIGGER tibero.tr1
    AFTER DELETE ON tbl2 FOR EACH ROW
BEGIN
    IF(DELETING) THEN
        DELETE FROM tbl3
            WHERE ID    = :OLD.ID;
    END IF;
END;
/
```

다음은 **CREATE TRIGGER** 문을 사용해 DDL 트리거를 생성하는 예입니다.

```sql
CREATE OR REPLACE TRIGGER ddl_trg_example
  AFTER CREATE ON DATABASE
BEGIN
  INSERT INTO tbl2 VALUES (0);
END;
/
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.tibero.com/tibero-manuals/7.2.6.manuals/sql-reference-guide/data-definition-language/create-trigger.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
