1. AFTER UPDATE, AFTER DELETE 트리거: 변경/삭제 로그 자동 백업
시나리오
회원 데이터를 singer 테이블로 분리했는데, 이 테이블에서 회원 정보가 수정되거나 삭제될 때 백업 테이블에 자동 기록되도록 한다.
구성 테이블
- singer: 회원 정보 테이블 (member 테이블에서 추출)
- backup_singer: 변경 로그 기록 테이블
use market_db;
create table if not exists singer (
select mem_id, mem_name, mem_number, addr
from `member`
);
create table backup_singer (
mem_id char(8) not null,
mem_name varchar(10) not null,
mem_number int not null,
addr char(2) not null,
modType char(2), -- '수정' 또는 '삭제'
modDate date, -- 변경일
modUser varchar(30) -- 변경한 사용자
);
(1) 수정 트리거 : AFTER UPDATE
drop trigger if exists singer_updateTrg;
delimiter $$
create trigger singer_updateTrg
after update on singer
for each row
begin
insert into backup_singer
values (
OLD.mem_id, OLD.mem_name, OLD.mem_number, OLD.addr,
'수정', curdate(), current_user()
);
end $$
delimiter ;
(2) 삭제 트리거 : AFTER DELETE
drop trigger if exists singer_deleteTrg;
delimiter $$
create trigger singer_deleteTrg
after delete on singer
for each row
begin
insert into backup_singer
values (
OLD.mem_id, OLD.mem_name, OLD.mem_number, OLD.addr,
'삭제', curdate(), current_user()
);
end $$
delimiter ;
ex)
update singer
set addr = '미국'
where mem_id = 'BLK';
delete from singer
where mem_number >= 7;
select * from backup_singer;
💡 OLD 키워드는 트리거에서 변경되기 전의 데이터를 참조할 때 사용한다. 이 값들을 기록하여 나중에 데이터 변경 이력 추적이 가능하다.
2. AFTER INSERT 트리거 : 로그 자동 기록
시나리오
players 테이블에 선수가 새로 추가될 때마다 어떤 팀에 어떤 선수가 등록되었는지를 자동으로 player_insert_logs 테이블에 남긴다.
구성 테이블
use baseball_league;
create table if not exists player_insert_logs (
log_id int auto_increment primary key,
team_id int,
log_msg varchar(255),
log_time datetime
);
트리거 정의
drop trigger if exists after_player_insert;
delimiter $$
create trigger after_player_insert
after insert on players
for each row
begin
insert into player_insert_logs (team_id, log_msg, log_time)
values (
NEW.team_id,
concat('team', NEW.team_id),
now()
);
end $$
delimiter ;
실행 예제
insert into players values
(106, 'Lee Jun', '타자', '2000-01-01', 1);
insert into players values
(107, 'Lee Jun', '타자', '2000-01-01', 1),
(108, 'Kim Jun', '타자', '2000-01-01', 1),
(109, 'Park Jun', '타자', '2000-01-01', 1),
(110, 'Choi Jun', '타자', '2000-01-01', 1);
select * from player_insert_logs;
✅ NEW 키워드는 INSERT 혹은 UPDATE 시 새롭게 들어온 데이터를 의미하며, 로그 남기기, 포인트 적립 등에 유용하게 활용된다.
3. 트리거 실정 활용 시나리오 예시
1) 회원 탈퇴 시 로그 기록
- AFTER DELETE 트리거로 log_table에 자동 기록
2) 재고가 0이 되면 품절 처리
- 상품 테이블에서 stock = 0일 때, is_sold_out을 1로 자동 변경
- AFTER UPDATE 트리거 사용
create trigger soldout_flag_trigger
after update on products
for each row
begin
if NEW.stock = 0 then
update products
set is_sold_out = 1
where product_id = NEW.product_id;
end if;
end;
3) 주문 시 포인트 자동 적립
- AFTER INSERT 트리거로 포인트 계산 후 적립 테이블 업데이트
트리거 사용 시 주의사항
- 무한 루프 주의
- 트리거 내부에서 자기 자신을 다시 호출하는 구조는 금지 (예: UPDATE → 트리거 → UPDATE → 무한 반복)
- 디버깅 어려움
- 자동 실행되므로 오류 발생 시 확인이 어렵다 → 로그 테이블을 활용하여 상태 기록 필수
- 성능 저하 가능성
- 너무 많은 트리거는 오히려 시스템 부하를 줄 수 있음 → 필요한 경우에만 적용할 것
'웹개발 > SQL(mySQL)' 카테고리의 다른 글
| 정규화 (2) | 2025.06.27 |
|---|---|
| ERD Diagram (0) | 2025.06.26 |
| MySQL(Trigger) (1) | 2025.06.24 |
| 동적 SQL : Prepare& Execute (1) | 2025.06.23 |
| MySQL - 스토어드 프로시저 (0) | 2025.06.22 |