반응형
트리거(Trigger)
- 특정 테이블에 삽입, 수정, 삭제 등의 데이터 변경 이벤트가 발생하면 DBMS에서 자동적으로 실행되도록 구현된 프로그램입니다.
- 이벤트는 전체 트랜잭션 대상과 각행에 의해 발생되는 경우 모두를 포함할 수 있으며 테이블과 뷰(View), DB 작업을 대상으로 정의할 수 있습니다.
트리거의 목적
- 특정 테이블에 대한 데이터 변경을 시작점으로 설정하고, 그와 관련된 작업을 자동적으로 수행하기 위해 트리거를 사용합니다.
- 일반적으로 이벤트와 관련된 테이블의 데이터 삽입, 추가, 삭제 작업을 DBMS가 자동적으로 실행시키는데 활용합니다.
트리거의 종류
종류 | 설명 |
헹 트리거 | 데이터 변화가 생길 때마다 실행 |
문장 트리거 | 트리거에 의해 단 한 번 실행 |
트리거의 구성
※ 프로시저나 사용자 정의함수와 기본적 문법은 같습니다.
※ 반환 값이 없고, DML을 주된 목적으로 한다는 점에서는 프로시저와 비슷합니다.
- 트리거 실행을 위한 이벤트를 인지하기 위해 EVENT 명령을 사용합니다.
- 외부 변수 IN / OUT 이 없습니다.
구성요소 | 설명 |
선언부(DECLARE) | 트리거의 명칭을 정의하는 부분 |
이벤트부(EVENT) | 트리거가 실행되는 타이밍, 이벤트를 명시하는 부분 |
시작/종료부(BEGIN/END) | 트리거의 시작과 종료를 표현하며, BEGIN/END가 쌍을 이룸 다수 실행을 제어하는 기본적 단위가 되며 논리적 프로세스를 구성 |
제어부(CONTROL) | 기본적으로는 순차적으로 처리 비교 조건에 따라 블록 또는 문장을 실행 조건에 따라 반복 실행 |
SQL | DML을 주로 사용 자주 사용되지는 않지만 DDL(CREATE, ALTER, DROP, TRUNCATE)을 사용 |
예외부(EXCEPTION) | BEGIN~END절에서 실행되는 SQL문이 실행될 때 예외 발생 시 예외 처리 방법을 정의하는 처리부 |
선언부(DECLARE)
CREATE TRIGGER 트리거명
CREATE OR REPLACE TRIGGER 트리거명
구성 | 설명 |
CREATE | DBMS 내에 객체(트리거, 함수, 프로시저)를 생성 OR REPLACE 는 기존 프로시저 존재 시 현재 컴파일 하는 내용으로 덮어씀 (같은 이름의 프로시저가 존재할 경우 OR REPLACE 가 없으면 에러 발생) |
TRIGGER | 트리거(TRIGGER)를 사용한다는 의미 |
트리거명 | 해당 트리거를 지칭하는 이름 |
이벤트부(TRIGGER)
순서 이벤트 ON 테이블명
[FOR EACH ROW]
-- 순서 : BEFORE, 이벤트 : 하나의 이벤트(INSERT)
BEFORE INSERT ON TABLE_NAME
-- 순서 : AFTER, 이벤트 : 여러 이벤트(INSERT, DELETE)
AFTER INSERT OR DELETE ON TABLE_NAME
-- 순서 : AFTER, 이벤트 : 하나의 이벤트(INSERT)
AFTER INSERT ON TABLE_NAME
FOR EACH ROW -- 변경되는 데이터 행의 수만큼 실행 INSERT, DELETE 는 FOR EACH ROW 없이 사용할 수 없음
시작/종료부(BEGIN/END)
트리거의 실행 시작과 종료를 알려주는 부분으로 프로시저에 BEGIN, END는 프로시저에 반드시 포함되어야 합니다.
제어부(CONTROL)
단위 블록별 실행흐름을 제어하는 부분으로 크게 IF문과 CASE문으로 나뉩니다.
SQL
- SELECT, INSERT, UPDATE, DELETE 를 주로 사용합니다.
- 행 트리거 안에서 접두어를 붙여 OLD(데이버 변경 전) NEW(데이터 변경 후) 값을 참조합니다.
데이터 작업 | OLD | NEW |
INSERT | NULL | 삽입 후 값 |
UPDATE | 갱신 전 값 | 갱신 후 값 |
DELETE | 삭제 전 값 | NULL |
예외부(EXCEPTION)
반드시 포함될 필요는 없습니다.
트리거 실행 중 발생 가능한 예외 상황을 수행하는 부분입니다.
트리거 예시
※ 주의사항
- 트리거 내에서는 COMMIT, ROLLBACK 등의 트랜잭션 제어어(TCL) 사용 시 컴파일 에러가 발생합니다.
- 트리거 실행 중 오류가 발생하게 되면 트리거 실행의 원인을 제공한 데이터 작업에도 영향을 미치게 됩니다.
(테이블에 데이터를 INSERT 후 실행되는 트리거에서 오류가 발생할 경우 트리거 후 작업이 진행되지 않거나 데이터가 추가되지 않습니다.)
-- 선언부
CREATE TRIGGER INSERT_TABLE_NAME
-- 이벤트부
AFTER INSERT ON TABLE_NAME
FOR EACH ROW
-- 시작/종료부
BEGIN
-- 제어부
IF INSERTING -- IF INSERTING, IF UPDATING, IF DELETING
THEN
-- SQL
INSERT INT TABLE_NAME_HISTORY
(
COL_1,
COL_2,
COL_3
) VALUES (
:NEW.COL_1,
:NEW.COL_2,
"INSERT"
);
END IF;
END;
[DB] 사용자 정의함수(User-Defined Function)
반응형
'개발 > DB' 카테고리의 다른 글
[DB] 데이터베이스 고립화 (0) | 2021.02.25 |
---|---|
[DB] 사용자 정의함수(User-Defined Function) (0) | 2021.02.16 |
[DB] 프로시저(Procedure) (0) | 2021.02.15 |
[MySQL] MySQL Workbench 에서 Schema 및 Table 추가 (0) | 2021.01.15 |
[MySQL] MySQL Workbench 사용자 계정 등록 (0) | 2021.01.15 |
댓글