이번 포스팅에서는 트리거에 대해 살펴보도록 하겠습니다.
트리거 (Trigger)
특정 조건이 만족하면 저절로 실행되는 일종의 장치라고 볼 수 있어요. 프로시저나 펑션과 다르게 한번 설정하면 동작을 항상 감시하고 있다가 조건에 해당하는 동작이 수행되면 순간 실행되는 특징을 가지고 있습니다.
[ 기본 구조 ]
DELIMITER $$
CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE }
ON table_name FOR EACH ROW
BEGIN
-- 트리거 내용
END
DELIMITER ;
[ 종류 ]
- 행 트리거 : 테이블 행 각각 실행된다.
- 문장 트리거 : INSERT, DELETE, UPDATE 문에 대해서 한번만 실행된다.
[ 이벤트 속성 ]
- 작동 시점
- After : 이벤트(조건 명령문)발생 이후 트리거 실행
- Before : 이벤트(조건 명령문)발생 이전 트리거 실행
- 이벤트(조건 명령문)
- Delete : 삭제 했을 때 트리거 실행
- Insert : 삽입 했을 때 트리거 실행
- Update : 수정 했을 때 트리거 실행
ex)
before delete on A
: A 테이블에서 데이터가 삭제되기 전에 트리거 실행
after delete on B
: B 테이블에서 데이터가 삭제 된 이후 트리거 실행
before insert on C
: C 테이블에서 데이터가 삽입 되기 전에 트리거 실행
[ 키워드 ]
🔍 Old
: 예전 데이터 즉, delete로 삭제된 데이터 또는 update로 바뀌기 전의 데이터를 의미합니다.
🔍 New
: 새 데이터 즉, insert로 삽입된 데이터 또는 update로 바뀐 후의 데이터를 의미합니다.
이벤트 | old | new |
delete | O | X |
insert | X | O |
update | O | O |
그럼 이제 트리거에 대한 개념과 속성을 이해했으니 예제를 살펴볼까요 ?
예제
[ 기본 테이블과 백업을 위한 테이블 ]
CREATE TABLE chat(
id VARCHAR(32),
answer VARCHAR(32) NOT NULL
);
CREATE TABLE chatBackup(
idBackup VARCHAR(32),
answerBackup VARCHAR(32) NOT NULL
);
[ 기본 테이블에 데이터 삽입 ]
INSERT INTO chat VALUE ('pigg', '안녕');
INSERT INTO chat VALUE ('lemon', '반가워');
INSERT INTO chat VALUE ('pigg', '오늘 날씨 어때?');
INSERT INTO chat VALUE ('lemon', '날씨 좋아');
[ 현재 테이블 상태 ]
왼 : chat / 오 : chatBackup
[ 트리거 작성 ]
DELIMITER $$
CREATE TRIGGER backup_chat
BEFORE DELETE ON chat
FOR EACH ROW
BEGIN
DECLARE idTemp VARCHAR(32);
DECLARE answerTemp VARCHAR(32);
SET idTemp = OLD.id;
SET answerTemp = OLD.answer;
INSERT INTO chatBackup VALUE (idTemp, answerTemp);
END $$
DELIMITER ;
해당 트리거는 기본 테이블에 DELETE 연산이 발생하기 이전 chatBackup 테이블에 삭제 전 데이터를 저장하는 트리거입니다.
[ 이벤트 발생 시키기 ]
DELETE FROM chat WHERE id = 'pigg';
[ 결과 ]
왼 : chat / 오 : chatBackup
chat 테이블에서 삭제했던 데이터가 트리거로 인해 chatBackup 테이블에 자동으로 백업된 것을 확인할 수 있어요.
트리거의 활용
이렇게 트리거는 임시 저장, 데이터 복구, 채팅 로그 등 다양한 곳에 활용이 가능해요.
트리거의 장점은
- 데이터의 무결성 강화 (참조 무결성)
- 업무처리 자동화
- 트리거를 사용해 트랜잭션에 의해 자동으로 다른 명령을 일으켜 업무처리를 자동화 할 수 있음
- 중간에 사용자 개입 없이 구현된 규칙대로 알아서 실행
트리거의 단점은
- 과도하게 사용하면 복잡한 상호 의존성을 야기
- 하나의 트리거가 활성화되어 이 트리거 내의 SQL 문이 수행되고 그 결과로 다른 트리거 .. 활성화 .. ....
< 참고 자료 >