본문 바로가기
DATABASE/Oracle

[Oracle] DML Trigger - 테이블에서 사용하는 트리거 정리

by DANEW 2024. 11. 11.

DML Trigger

트리거, 우리 대부분 트리거에 대해서 알고 있을 것 이다.

 

트리거의 특징으로는 아래 정도 알 고 있을 것 이다.

* 특정한 동작이 실행되었을 때, 자동으로 함께 실행되는 것 

* 데이터의 무결성을 유지

* 자동으로 함께 실행되기에 성능 이슈가 있을 수 있다

create or replace trigger [트리거 이름]
before [or atfer] -- dml문 이전이냐 이후냐
insert [or update / delete] [트리거가 동작할 테이블] -- 테이블에서 지정한 dml문이 동작시 트리거 실행
[FOR EACH ROW] -- 행 트리거 일 경우 / 문장 트리거 생략
begin
    -- 동작할 트리거 내용
end;

근데 트리거에 대해서 깊게 생각 해본 적이 있는가??? 그냥 함께 실행된다고만 알고 있는 사람이 많을 수도 있다.

 

이 트리거의 트랜잭션은???

DML 본문의 트랜잭션 보다 먼저 실행되는 것인가? 다음에 실행되는것인가??

과연 어떻게 동작하는가에 대해서 조금 고민해보며, 간단하게 DML Trigger에 대해서 정리해보도록 하자.

 

DML Trigger의 종류

테이블 트리거는 크게 2가지의 종류로 나뉜다.

 

Row 단위의 작업이 실행되었을 때 행 작업마다 실행되는 행 트리거 (Row Trigger)

SQL 문 전체에 대해 한번 실행되는 문장 트리거 (Statement Trigger)

 

먼저 이 두가지의 종류에 대해 설명해보도록 하겠다.

 

Row Trigger

행 단위 트리거는 실행되는 DML에 대해서 변경이 수행되는 각 행마다 함께 실행되는 트리거이다.

 

행 단위 트리거에 대한 특징에 대해 간단하게 나열해보자면

1. DML이 발생하여 변경이 수행 된 행의 수 만큼 해당 트리거 동작이 실행된다.

2. DML이 발생한 테이블에 대해 행 단위 트리거 내부에서 사용 할 수 없다.

3. 변경이 발생한 결과 전후 값을 가상테이블 :NEW / :OLD를 통해 사용 할 수 있다.

 

해당 내용들을 간단히 이해해보자면,

1. 행단위 트리거니까 각 행 변경 작업 단위로 트리거가 실행된다.

2. 행단위 트리거 내부에 해당 테이블을 또 사용한다면?

 -  delete 실행 -> 트리거 내부에  해당 테이블 delete 정의 및 실행 -> delete 실행 트리거 또 발생 ....  이런식의 무한루프가 발생 할 수도...

3. 각 행 별로 작업이 진행 되기에 가상테이블에 변경 전후의 값을 가지고 있을 수 있다.

 - 각 행별로 작업이 진행 되기에 작업된 행의 변경 전/후 값을 특정하고 가지고 있을 수 있다.

 

주로 사용은 각 행의 작업에 대한 로그를 남기거나, 특정 값이 변경되었을 때 함께 변경되어야 하는 것들에 대해 정의한다.

 

예를들어 보면,

Delete 문이 실행 되었을때 해당 delete 된 데이터의 history를 남기고자 다른 테이블에 쌓는다 했을 때 실행 될 수 있다.

Update 문이 실행되어 가격이 변동 될 경우, 다른 정산 테이블에 총 정산금액을 함께 변경한다던지 할 수 있다.

 

Statement Trigger

문장 단위 트리거는 실행되는 DML에 대해서 단 한번만 실행이 된다.

 

문장 단위 트리거에 대한 특징에 대해 간단하게 나열해보자면

1. DML의 문장에 대해 단 한번 실행된다.

2. DML 문장이 발생한 테이블에 대해 문장 단위 트리거에서는 사용 할 수 있다.

3. 변경이 발생한 결과 전후 값을 사용 할 수 없다.

 

위 내용에 대한 이해를 돕자면,

1. 문장을 하나로 보고 하나의 작업이 끝날시 실행되는 것이 문장 단위 트리거이다. 즉, 한번만 사용가능

2. 문장 단위 트리거는 문장에 대한 작업이므로 트리거 내에서 해당 테이블을 사용 할 수 있다.

 - DML문장이 끝나고 전체 카운트가 몇개인지? 이런 것들을 확인 할 수 있다.

3. 문장 단위이기에 각 행에 대한 변경 전/후 값을 가지고 있을 수 없다.

 - 그러므로 :OLD / :NEW 변수를 사용 할 수 없다.

 

주로 사용은 전체 작업에 대한 로그를 남기는데 사용한다.

 

하나의 문장이 시작되고 끝나는 시간을 기록하는 용도로 사용할 수 있다.

 

DML Trigger의 동작 타이밍

그렇다면 이러한 DML Trigger를 어느 타이밍에 실행하는가?

사실 같이 동작 한다고 생각만 했지 이 부분에 대해서는 크게 생각해보지 않았던 것 같다.

 

트리거가 동작 될 이벤트 DML에 대해 DML이 수행되기 전? 후?

 

트리거는 사실 트리거를 발동시키는 원래의 DML과 같은 트랜잭션을 가진다.

즉, 같이 커밋되거나 롤백된다. 하지만 원래의 DML과 같은 쿼리 블록은 아니기에 DML의 Before / After 에 동작 위치를 정할 수 있다.

 

Before Trigger

DML의 실행 전에 먼저 실행되는 트리거이다.

본문이 실행되기 전에 실행되므로 데이터의 변경 전 검증사항이나 특정 작업을 수행 하도록 지정 할 수 있다.

 

After Trigger

DML의 실행 후에 실행되는 트리거이다.

본문이 실행되고 실행 되기 때문에 데이터의 변경사항을 로깅하거나, 다른 테이블과 동기화, 알림 발송 등을 하는데 사용 할 수 있다.

 

반응형