웹개발/SQL(mySQL)

Trigger - 자동화

bergerac 2025. 6. 25. 09:11

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 트리거로 포인트 계산 후 적립 테이블 업데이트

트리거 사용 시 주의사항

  1. 무한 루프 주의
    • 트리거 내부에서 자기 자신을 다시 호출하는 구조는 금지 (예: UPDATE → 트리거 → UPDATE → 무한 반복)
  2. 디버깅 어려움
    • 자동 실행되므로 오류 발생 시 확인이 어렵다 → 로그 테이블을 활용하여 상태 기록 필수
  3. 성능 저하 가능성
    • 너무 많은 트리거는 오히려 시스템 부하를 줄 수 있음 → 필요한 경우에만 적용할 것

'웹개발 > 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