개념
트리거는 테이블에 대한 이벤트에 반응해 자동으로 실행되는 작업이다. 트리거를 이용해 데이터 작업 제한, 작업 기록, 변경 작업 감사 등을 할 수 있다.
종류
- 행트리거: 테이블 안의 영향을 받은 행 각각에 대해 실행된다. 변경 전 또는 후의 행은 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 트리거 예시
'코딩 > DB' 카테고리의 다른 글
[MSSQL] DECLARE (0) | 2020.09.21 |
---|---|
[MSSQL] set nocount on (0) | 2020.09.21 |