### h_trigger 폴더 > a_트리거01 파일 ###
# 트리거(trigger)
# : '방아쇠', 자동 실행
# : 자동으로 수행하여 사용자가 추가 작업을 잊어버리는 실수를 방지
# 트리거 사용 목적
-- 수동으로 처리하는 일련 동작을 자동으로 처리하여 데이터의 오류를 방지
-- 데이터 무결성 처리에 도움
# insert, update, delete (DML, 데이터 조작 언어)작업이 발생하면 실행되는 코드
# : 이벤트가 발생할 때 작동
# 트리거 종류
# after 트리거*, before 트리거
# 트리거 문법 체계(기본 형식)
# : 스토어드 프로시저와 유사
# cf) 차이점: call 문으로 직접 실행 X
# 무조건 테이블에서 insert, update, delete 등의 이벤트가 발생하는 경우에만 자동 실행
use market_db;
create table if not exists trigger_table (
id int,
txt varchar(10)
);
insert into trigger_table
values
(1, '레드벨벳'),
(2, '잇지'),
(3, '블랙핑크');
select * from trigger_table;
-- 트리거 생성
drop trigger if exists myTrigger;
delimiter $$
create trigger myTrigger
# 트리거 종류를 설정
# : 트리거종류 이벤트종류
# 1) 트리거종류: after, before
# 2) insert, update, delete
after delete -- delete문이 발생된 이후에 작동
# on 조건으로 트리거를 부착할 테이블을 지정
on trigger_table
for each row -- 각 행마다 적용시킴 (모든 트리거에 작성)
# 실제 트리거에서 작동할 부분
begin
set @msg = '가수 그룹이 삭제됨';
end $$
delimiter ;
set @msg = '';
select @msg;
insert into trigger_table values (4, '마마무');
select @msg;
update trigger_table set txt = '블핑' where id = 3;
select @msg;
select * from trigger_table;
select @msg;
delete from trigger_table
where id = 4;
select @msg;
# 트리거 VS 트랜잭션
# 트리거: 특정 조건이 충족되거나 이벤트가 발생할 때 자동으로 실행
# 트랜잭션: 일련 동작의 묶음, 원자성을 보장
# cf) 원자성: 모두 성공 또는 모두 실패
### b_트리거02 ###
# 트리거 예제 #
use market_db;
# singer 테이블: member 테이블에서 데이터를 가져옴
create table 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) -- 변경한 사용자
);
# 변경(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 ;
# OLD 테이블
# : update나 delete가 수행될 때
# : 변경되기 전의 데이터가 잠깐 저장되는 임시 테이블
# curdate(): 현재 날짜
# current_user(): 현재 작업 중인 사용자
select current_user();
select * from singer;
update singer
set addr = '미국'
where
mem_id = 'BLK';
update singer
set mem_number = 6
where
mem_id = 'BLK';
select * from backup_singer;
# 삭제가 발생했을 때 작동하는 트리거
# singer_deleteTrg
drop trigger if exists siger_deleteTrg;
delimiter $$
create trigger singet_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 ;
delete from singer where mem_num>=7;
select * from backup_singer
use baseball_league;
select* from players;
select * from teams;
# 트리거 생성
# 선수가 새로 등록될때 마다 해당 선수의 팀에 속한 선수의 수를 자동으로 업데이트
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 &&
# old: update, delete시 변경사항이 임시로 저장되는 테이블
# new: insert, update, delete 시 방금 삽입 혹은 갱신된 행을 참조
delimiter ;
insert into players values(106,'ff','타자','2000-01-01',1);
select * from player_insert_logs;
'SQL' 카테고리의 다른 글
SQL정리(정규화 개요) (1) | 2024.09.30 |
---|---|
SQL정리(ERD) (0) | 2024.09.27 |
SQL정리(동적SQL) (0) | 2024.09.27 |
SQL정리(now(), sysdate(), current_timestamp 차이) (1) | 2024.09.26 |
SQL정리(StoredProcedure) (0) | 2024.09.26 |