웹개발/SQL(mySQL)

MySQL(Trigger)

bergerac 2025. 6. 24. 09:11

트리거란?

데이터베이스에서 특정 이벤트가 발생했을 때 자동으로 실행되는 SQL 코드 블록을 트리거라고 부른다.
사용자가 일일이 놓칠 수 있는 작업을 자동으로 처리해 주기 때문에, 데이터 무결성 유지와 업무 로직 자동화에 매우 유용하다.

SQL의 특징과 기능

  1. 자동 실행
    • 트리거를 정의해 두면 해당 이벤트 발생 시 자동으로 작동
  2. 이벤트 기반 처리
    • INSERT, UPDATE, DELETE 같은 DML 이벤트를 감지
  3. 무결성 보장
    • 로그 기록, 계산 값 반영, 업데이트 시간 갱신 등 데이터 변조 방지

트리거 사용 예

  • 중요 작업 누락 방지
    • 예: 삭제된 레코드에 대한 로그 자동 기록
  • 연관 데이터 자동 계산
    • 예: 주문 테이블에 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 트랜잭션

  1. 트리거(Trigger)
    • 자동 실행: INSERT, UPDATE, DELETE 이벤트 발생 시
    • 사용 목적: 자동화된 비즈니스 로직 처리(로그 기록, 자동 계산 등)
    • 제약: CALL 문으로 직접 실행 불가, 디버깅 어려움
  2. 트랜잭션(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