DB

트리거

sdafdq 2023. 11. 15. 12:16

트리거는 자동수행하는.

그러니까 특정 테이블에 insert, delete, update등이 작동할 때 자동으로 실행되게끔 할 수 있음.

일반적으로 after를 많이 씀.

 

정의는 스토어드 프로시저랑 비슷한데, call로 따로 호출할 수는 없음.

그래서 in, out 등의 매개변수도 불가.

 

delimiter $$
create trigger myTrigger
    after delete
    on trigger_table
    for each row
begin
	set @msg = '가수 그룹이 삭제됨';
end $$
delimiter ;

이렇게 스토어드 프로시저 정의 하듯,

delimiter로 시작해서,

create trigger 하면서 시작함.

after delete는 delete 후에.

on trigger_table이라는 테이블에서

for each row 각각의 row마다 적용

begin

~~~

end $$

 

끝임.

delimiter $$
create trigger 트리거명
    after또는before insert,delete,update등언제작동할지
    on 대상테이블
    for each row -- 각각의 행 마다
begin
	-- ~~트리거시 (insert, delete, update 등이 작동 시) 할 내용
end $$
delimiter ;

 

실제로 이거

set @msg = '';
insert into trigger_table values(4, '마마무');
select @msg;

update trigger_table set txt='블핑' where id = 3;
select @msg;

delete from trigger_table where id = 4;
select @msg;

delete 했을 때 작동.

 

이게 좋은 점이, backup만들기 편함.

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) -- 변경 사용자
);

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 ;


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 ;

백업용 테이블 생성하고,

트리거 정의

update 이후, 

singer라는 테이블에서 (singer라는 테이블에서 update 이후)

각 행마다 적용 시키는 걸로.

insert into backup_singer values(old.mem_id, old.mem_name, old.mem_number, old.addr, '수정', curdate(), current_user());

백업 테이블에 modType만 '수정'으로 하고 현재시간, 현재 유저(현재 db유저)를 넣어줌.

old는 mysql에서 제공해 주는거임. new도 있음.

이런 거임.

대충 뭔가 CUD로 바꾸기 전에, 그 전의 값을 old에 담아두고, 새로 들어오는 값들을 new에다 담아둠.

 

insert into backup_singer values(old.mem_id, old.mem_name, old.mem_number, old.addr, '수정', curdate(), current_user());

다시 보면 이전 값들을 우리가 update했을때 이후에 

저렇게 이전 값들을 백업테이블에다가 써 주는데,

전의 값들을 써줌.

 

삭제도 마찬가지로.

전의 값 담아두면서 수정형식만 '삭제'라고 해둠.

 

delimiter $$
create trigger 트리거명
    after또는before insert,delete,update등언제작동할지
    on 대상테이블
    for each row -- 각각의 행 마다
begin
	-- ~~트리거시 (insert, delete, update 등이 작동 시) 할 내용
end $$
delimiter ;

 

'DB' 카테고리의 다른 글

커서  (0) 2023.11.15
스토어드 함수  (0) 2023.11.15
스토어드 프로시저2  (0) 2023.11.14
인덱스  (0) 2023.11.10
뷰 가상테이블  (0) 2023.11.09