MySQL 트리거는 BEGIN…END 구문을 사용하면 여러 개의 명령문을 실행할 수 있습니다. BEGIN 블록 내부에는 저장 프로시저(스토어드 루틴)에서 허용되는 다른 문법들, 예를 들어 조건문(IF)이나 반복문(LOOP) 등도 함께 사용할 수 있습니다.
기본 개념
트리거 본문에 단일 명령문만 작성할 경우에는 BEGIN…END 없이 바로 작성해도 되지만, 두 개 이상의 명령문을 실행하려면 반드시 BEGIN과 END로 묶어주어야 합니다. 또한 구분자(delimiter)를 변경하여 트리거 생성 시 세미콜론 충돌을 방지하는 것이 일반적입니다.
예제: IF 조건문이 포함된 BEFORE INSERT 트리거
아래 예제는 student_age 테이블에 데이터가 삽입되기 전에 나이 값의 유효 범위를 검사하고 자동으로 보정해 주는 BEFORE INSERT 트리거입니다. IF 조건문을 사용해 0 미만의 값은 0으로, 100 초과의 값은 100으로 설정합니다.
mysql> DELIMITER //
mysql> CREATE TRIGGER before_insert_studentage
-> BEFORE INSERT ON student_age FOR EACH ROW
-> BEGIN
-> IF NEW.age < 0 THEN SET NEW.age = 0;
-> ELSEIF NEW.age > 100 THEN SET NEW.age = 100;
-> END IF;
-> END //
Query OK, 0 rows affected (0.30 sec)
코드 설명
DELIMITER // : 기본 구분자인 세미콜론 대신 //를 새 구분자로 지정하여, 트리거 내부의 세미콜론이 MySQL 클라이언트에 의해 잘못 해석되지 않도록 합니다.
IF … ELSEIF … END IF; : NEW.age 값이 0보다 작으면 0으로, 100보다 크면 100으로 강제 설정합니다. NEW 키워드는 삽입될 행의 값을 참조합니다.
END // : 트리거 정의를 종료하고 지정한 구분자로 명령을 실행합니다.
정리
이처럼 BEGIN…END 블록 안에는 여러 개의 SQL 명령문뿐 아니라 조건문, 반복문, 변수 선언 등 저장 루틴에서 사용 가능한 다양한 문법을 활용할 수 있습니다. 이를 통해 데이터 유효성 검사, 자동 값 보정, 로그 기록 등 복잡한 로직을 트리거 하나로 처리할 수 있습니다.