본문 바로가기

코딩/DB

[MSSQL] 트리거

개념

트리거는 테이블에 대한 이벤트에 반응해 자동으로 실행되는 작업이다. 트리거를 이용해 데이터 작업 제한, 작업 기록, 변경 작업 감사 등을 할 수 있다.

 

종류

- 행트리거: 테이블 안의 영향을 받은 행 각각에 대해 실행된다. 변경 전 또는 후의 행은 OLD, NEW라는 가장 줄 변수를 사용해 읽을 수 있다.

- 문장 트리거: INSERT, UPDATE, DELETE문에 대해 한번만 실행된다.

 

구조

CREATE TRIGGER [트리거 이름]
       BEFORE | AFTER
       INSERT | UPDATE | DELETE ON [테이블 이름]
       FOR EACH ROW -- 각 행의 변화에 대해 트리거 실행 (행트리거)

   BEGIN

   DECLARE

        -- 변수선언
        -- SQL문

     END;

 

속성

- before 또는 after: 트리거가 실행되는 시기를 지정한다. before은 쿼리가 테이블에 적용 되기 전, 데이터 값을 검사하기 위해 많이 사용한다. after는 쿼리가 테이블에 적용된 후에 실행되며, 쿼리 발생 후 값을 변경할 때 사용된다.

필자는 새로운 데이터가 들어오면, 데이터의 형식을 자동으로 바꿔주는 작업을 위해 after 트리거를 사용할 것이다.

- instead of: 트리거를 원래 문장 대신 수행

- when: 트리거를 시작하는 조건식을 지정

 

FOR EACH ROW

행 트리거(for each row): 행 단위로 트리거 실행한다. 칼럼의 데이터 행이 변경될 때마다 실행하기 때문에 실제 그 데이터 값을 제어할 수 있다. 실제 값을 수정, 변경, 저장하기 위해 사용한다.

 

문장 트리거: 단일 트랜잭션에 대해 한번만 실행한다. 때문에 칼럼의 각 행을 제어할 수 없다. 칼럼의 데이터 값에 상관없는 경우 많이 사용하는데, 컬럼의 변화를 감지하는 경우에 사용한다.

 

OLD/ NEW 임시테이블

트리거가 생성하는 임시테이블이다. 트리거가 작동되기 전, 원본 테이블을 OLD, 트리거가 작동된 후 새로운 테이블을 NEW라고 저장한다.

직접 임시테이블에 접근해서 값을 가져올 수 있다.

 

중첩 트리거

한 트리거가 다른 트리거를 작동시키는 자기참조라 생각하면 된다.

만약, 중첩 트리거가 COMMIT되기 전 문제가 발생한다면 ROLLBACK 된다.

중첩 트리거는 자기자신을 참고할 수 없다. 예를 들어, TABLE1에서 TABLE1을 SELECT하는 트리거는 걸 수 없다.

mssql 트리거 예시

bigenergy.tistory.com/825

www.sqlprogram.com/Basics/sql-trigger.aspx

'코딩 > DB' 카테고리의 다른 글

[MSSQL] DECLARE  (0) 2020.09.21
[MSSQL] set nocount on  (0) 2020.09.21