3-2/DB

[Mysql]Trigger생성과 삭제(feat. delimiter)

개발자 덕구🐾 2021. 10. 25. 23:03
728x90

 

 

 

 

Mysql의 기능 Trigger에 대해서 설명해보고자 한다. 

 

ASSERTION 문이 존재하지만 ASSERTION은 기본 SQL에 포함되지 않는다.
mysql에서도 지원하지않는다고 하니 비슷한 역할을 하는 Trigger을 알아보자

 

 

 

Trigger

특정 사건이 발생하고, 특정 조건이 만족될때 저절로 실행되는 말그대로 방아쇠 같은 역할을 한다.

위키백과의 말을 빌리자면  테이블에 대한 이벤트에 반응해 자동으로 실행되는 작업을 의미한다.

 

 

트리거는 사건, 조건, 동작을 포함한다.

 

 

어떤 사건이 발생하면 검사가 시작되고, 동작을 수행할 조건이 명시되어있으며, 

주어진 조건이 만족되면 동작을 실행한다. 

 

 

 

 

 


 

 

 

 

예시 코드을 통해 알아보자

<Trigger 생성> 

 

delimiter //
create trigger [트리거 이름]
[before/update] [update/insert/delete] on [테이블 이름]
for each Row
BEGIN
	<트리거 조건 & 동작 > 
	IF new.amount < 1 then
    	SET NEW.amount = 1;
    ELSEIF new.amount > 4 then
    	SET NEW.amount = 4;
    END IF;
END; //

delimiter ;

 

일단 구조는 이렇게 생겼다.

상황에 따라 얼마든지 변화할 수 있다. 그 중 한 예시일 뿐이다.

 

 

앞서 트리거는 사건, 조건, 동작을 포함한다고 하였는데 

 

before update on account는 사건

IF new.amount < 1 then 는 조건

SET NEW.amount = 1; 는 동작이라고 보면 된다. 

 

Trigger 를 제거할때는 ?

 

 

Drop Trigger [trigger name];

 

 

이미 존재하는 트리거들을 확인하고 싶다면?

show triggers;

 

 

 

 

 

 

728x90

 

사건(event)의 속성에는 

 

before / after

: 조건 이전 / 이후 트리거 실행 

 

update / insert / delete 

 : 수정 / 삽입/ 삭제 했을 때 트리거 실행 

 

 

 

사용되는 키워드는 

 

new :  새로운 데이터 

old  : 이전 데이터 

 

 

-> 이벤트에 따라 사용가능한 키워드가 다르다. 

 

 

 

 


 

직접 예시 코드를 보고 한줄 한줄 따라가보자 

 

delimiter //
create trigger amount_check 
before update on account
for each Row
BEGIN
IF new.amount < 1 then
     SET NEW.amount = 1;
    ELSEIF new.amount > 4 then
     SET NEW.amount = 4;
    END IF;
END; //

delimiter ;

 

앞서 작성한 코드 블럭을 간단한 예시로 채워서 보았다.

 amount_check라는 trigger를 생성하는 코드이다. 

 

 

한줄씩 분석해보자.

 

 

1 ) delimiter //  : 원래 mysql은 ';'를 만나면 입력을 종료한다. Trigger을 설정하는 중에 종료하지 않을 예정임에도 불구하고 중간에 ';'을 써야하는 상황이 온다. 
그때 입력의 종료를 방지하기 위해서 //를 원래 ; 같은 종료 용도로 바꾸겠다는 의미이다.

즉 코드의 마지막에는 다시 ';'로 변경해주는 delimiter 가 필요함을 예상할 수 있다.


2) create trigger amount_check   :  amount_check라는 트리거 생성


3) before update on account : account라는 테이블에 업데이트가 되기 전

4) for each Row : 행별로 실행

5) BEGIN : 시작!

6) IF new.amount < 1 then    
SET NEW.amount = 1;

 : 새로 들어온 amount가 1보다 작다면 1으로 변경해라


7 )  ELSEIF new.amount > 4 then    
SET NEW.amount = 4;

: 새로 들어온 amount가 4보다 크다면 4로 변경해라


8)   END IF;
END; //

 : if 문은 끝이나고 END로 모두 끝냅니다. 
// 를 종료 용도로 변경하였으니 이제 입력이 종료됩니다.


9) delimiter ;  :  // 에서 ':' 로 다시 변경해줍니다.

 

 

 

즉 이 코드는 account라는 테이블이 update 되기 전 발동하는 트리거를 만드는 코드이다.

amount_check 라는 트리거는 자동으로 amount가 1보다 작으면 1로 저장하고, 4보다 크면 4를 저장한다. 

 

 

 

 


 

 

 

 

 

이것 말고도 다른 예시 코드를 보면 

 

delimiter |
create trigger check_value
before insert on t1
for each Row
BEGIN
	insert into t2 set a1 = new.a1;
    delete from t3 where a2 = new.a2;
END; |

delimiter ;

 

이런 식으로 delimiter 이후의 문자를 '|'등 다양하게 사용이 가능하다.

위 코드는 check_value라는 이름의 트리거를 생성하는 코드로 

t1 테이블에 insert 되기 전에

insert, delete를 수행하는 코드이다. 

 

이처럼 많은 Trigger를 상황에 따라 다양하게 생성할 수 있다. 

 

 

 

 

 

 

 

참고 :

https://blog.naver.com/PostView.nhn?blogId=alcmskfl17&logNo=221859839012 

 

[MySQL] 트리거(Trigger)의 활용

트리거(Trigger)란 특정 조건이 만족하면 저절로 실행되는 일종의 장치라고 볼 수 있다. 이녀석은 프로시...

blog.naver.com

 

 

 

 

 

 

 

반응형