트리거란?
데이터베이스에서 특정 이벤트가 발생했을 때 자동으로 실행되는 SQL 코드 블록을 트리거라고 부른다.
사용자가 일일이 놓칠 수 있는 작업을 자동으로 처리해 주기 때문에, 데이터 무결성 유지와 업무 로직 자동화에 매우 유용하다.
SQL의 특징과 기능
- 자동 실행
- 트리거를 정의해 두면 해당 이벤트 발생 시 자동으로 작동
- 이벤트 기반 처리
- INSERT, UPDATE, DELETE 같은 DML 이벤트를 감지
- 무결성 보장
- 로그 기록, 계산 값 반영, 업데이트 시간 갱신 등 데이터 변조 방지
트리거 사용 예
- 중요 작업 누락 방지
- 예: 삭제된 레코드에 대한 로그 자동 기록
- 연관 데이터 자동 계산
- 예: 주문 테이블에 INSERT 시 총액 자동 산출
- 갱신 시점 자동 처리
- 예: 회원 정보 UPDATE 시 마지막 수정 시간 자동 갱신
주의!
- 과도한 트리거 사용은 성능 저하와 디버깅 어려움을 초래할 수 있다.
- 정말 필요한 비즈니스 로직만 트리거로 처리하자.
트리거 생성 기본 문법
-- (1) 구분자 변경
DELIMITER $$
-- (2) 트리거 생성
CREATE TRIGGER 트리거이름
BEFORE|AFTER {INSERT|UPDATE|DELETE}
ON 테이블명
FOR EACH ROW
BEGIN
-- 자동 실행할 SQL 코드
END $$
-- (3) 구분자 원래대로 복귀
DELIMITER ;
- BEFORE 트리거: 작업 수행 전 실행
- AFTER 트리거: 작업 수행 후 실행
- 행 단위(FOR EACH ROW)로 각각의 레코드에 대해 실행
로그 기록용 트리거
-- 1) 데이터베이스 및 테이블 준비
CREATE DATABASE IF NOT EXISTS `trigger`;
USE `trigger`;
CREATE TABLE IF NOT EXISTS `trigger_table` (
id INT,
txt VARCHAR(10)
);
-- 2) 샘플 데이터 삽입
INSERT INTO `trigger_table`
VALUES
(1, '레드벨벳'),
(2, '에스파'),
(3, '하츠투하츠');
-- 3) 트리거 제거(재실행 편의)
DROP TRIGGER IF EXISTS myTrigger;
DELIMITER $$
-- 4) AFTER DELETE 트리거 생성: 삭제된 후 메시지 변수에 기록
CREATE TRIGGER myTrigger
AFTER DELETE
ON `trigger_table`
FOR EACH ROW
BEGIN
SET @msg = '가수 그룹이 삭제됨';
END $$
DELIMITER ;
-- 5) 테스트: 변수 초기화 및 이벤트 발생
SET @msg = '';
-- INSERT 테스트 (AFTER DELETE만 설정했으므로 변수 변화 없음)
INSERT INTO `trigger_table` VALUES (4, '아이브');
SELECT @msg; -- 결과: ''
-- UPDATE 테스트 (AFTER DELETE만 설정했으므로 변수 변화 없음)
UPDATE `trigger_table`
SET txt = '르세라핌'
WHERE id = 3;
SELECT @msg; -- 결과: ''
-- DELETE 테스트 (값 삭제 후 변수에 메시지 기록)
DELETE FROM `trigger_table` WHERE id = 4;
SELECT @msg; -- 결과: '가수 그룹이 삭제됨'
트리거 vs 트랜잭션
- 트리거(Trigger)
- 자동 실행: INSERT, UPDATE, DELETE 이벤트 발생 시
- 사용 목적: 자동화된 비즈니스 로직 처리(로그 기록, 자동 계산 등)
- 제약: CALL 문으로 직접 실행 불가, 디버깅 어려움
- 트랜잭션(Transaction)
- 수동 제어: BEGIN ~ COMMIT 또는 ROLLBACK
- 사용 목적: 여러 SQL문의 원자성(Atomicity), 일관성(Consistency) 보장
- 특징: 모두 성공하거나 모두 실패해야 함(하나라도 실패 시 전체 롤백)
'웹개발 > SQL(mySQL)' 카테고리의 다른 글
| ERD Diagram (0) | 2025.06.26 |
|---|---|
| Trigger - 자동화 (0) | 2025.06.25 |
| 동적 SQL : Prepare& Execute (1) | 2025.06.23 |
| MySQL - 스토어드 프로시저 (0) | 2025.06.22 |
| MySQL 형변환 (0) | 2025.06.21 |