반응형
MySQL에서는 트리거(Trigger)를 활용해 데이터의 삽입(INSERT), 수정(UPDATE), 삭제(DELETE) 시 자동으로 특정 로직을 실행할 수 있다. 특히 BEFORE INSERT, AFTER INSERT 트리거는 데이터가 추가되기 전후에 유효성 검사, 로그 기록, 자동 초기화 작업 등을 처리할 때 매우 유용하다.
✅ BEFORE INSERT: INSERT 수행 전에 실행됨
✅ AFTER INSERT: INSERT 수행 후에 실행됨
🧱 트리거 기본 구조
CREATE TRIGGER 트리거명
{BEFORE | AFTER} INSERT
ON 테이블명
FOR EACH ROW
BEGIN
-- 트리거 실행 로직
END;
- NEW.column_name: 삽입될 데이터의 컬럼 값을 의미함
- 트리거는 FOR EACH ROW 단위로 실행되며, SELECT, SET, IF, INSERT, UPDATE, DELETE 등을 포함할 수 있다
반응형
⚙️ BEFORE INSERT 트리거 예제 - 값 자동 초기화
회원가입 시 user_level이 비어 있으면 기본값으로 'basic'을 자동 삽입한다.
CREATE TRIGGER before_user_insert
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
IF NEW.user_level IS NULL THEN
SET NEW.user_level = 'basic';
END IF;
END;
이제 애플리케이션에서 user_level을 보내지 않아도, 자동으로 'basic'이 설정된다.
📝 AFTER INSERT 트리거 예제 - 로그 테이블 기록
주문 데이터가 저장된 직후, 로그 테이블에 자동으로 기록한다.
CREATE TRIGGER after_order_insert
AFTER INSERT ON orders
FOR EACH ROW
BEGIN
INSERT INTO order_log (order_id, action, created_at)
VALUES (NEW.id, 'insert', NOW());
END;
이 구조는 감사 로그(Audit Log) 구현에 자주 사용되며, 보안이나 데이터 추적에 매우 효과적이다.
반응형
🛠️ 실무에서 자주 쓰이는 활용 예시
사용 목적 | BEFORE INSERT | AFTER INSERT |
기본값 자동 세팅 | ✅ 가능 | ❌ 불가능 |
입력값 유효성 검증 | ✅ 가능 | ❌ 불가능 |
감시 및 로그 기록 | ❌ 제한적 | ✅ 적합 |
연결된 테이블 자동 생성 | ❌ 권장안함 | ✅ 많이 사용됨 |
❗ 주의사항
- 하나의 테이블에 동일 이벤트(BEFORE INSERT 등) 트리거는 하나만 생성 가능
- 트리거 안에서 CALL 프로시저를 사용할 수도 있으나, 루프나 무한 실행에 주의해야 함
- 트리거는 SHOW TRIGGERS; 명령으로 확인 가능하며, DROP TRIGGER 트리거명;으로 삭제 가능
📚 참고 공식 문서
MySQL Trigger 문서
🔗 https://dev.mysql.com/doc/refman/8.0/en/triggers.html
반응형
'DB' 카테고리의 다른 글
[MySQL] DML과 트랜잭션 오토커밋 제어 완벽 정리 ⚙️ (0) | 2025.07.03 |
---|---|
[MySQL] DML과 FOREIGN KEY 제약조건 관리 완전 정복 🔗 (1) | 2025.07.03 |
[MySQL] 트리거로 DELETE 감지: BEFORE / AFTER 완벽 가이드 🗑️ (2) | 2025.07.03 |
[MySQL] 트리거로 UPDATE 감지: BEFORE / AFTER 활용법 완전 정복 🛠️ (0) | 2025.07.03 |
[MySQL] WITH CTE로 INSERT / UPDATE / DELETE 처리하는 실전 예제 모음 (0) | 2025.07.03 |
[MySQL] VIEW를 통한 INSERT / UPDATE / DELETE 사용법 완전정복 (0) | 2025.07.03 |
[MySQL] CALL 프로시저 내 DML 실행 완전 정복 가이드 ⚙️ (0) | 2025.07.03 |
[MySQL] LOAD DATA INFILE로 대용량 데이터 빠르게 삽입하는 방법 ⚡ (0) | 2025.07.03 |