본문 바로가기
Database/MySQL

[MySQL] 트리거

by oncerun 2020. 7. 1.
반응형

트리거는 사전적 의미로 방아쇠를 뜻한다. 방아쇠를 당기면 자동으로 총알이 나가듯이, 트리거는 테이블에 어떠한 일이 발생되면 자동으로 실행된다.

 

테이블에 삽입, 수정, 삭제 등의 작업이 발생할 때 자동으로 작동되는 개체로 스토어드 프로시저와 비슷한 모양을 갖는다.

 

예를 들어 누군가가 A라는 테이블을 고의 또는 실수로 삭제했다고 치자, 그렇다면 삭제된 행의 내용을 복구하는 것도 어렵고 추적하는 것도 쉽지 않다. 따라서 삭제되는 순간에 A의 테이블 내용을 B라는 테이블에 기록해 놓는다면 문제점을 해결할 수 있다. 트리거는 이러한 기능을 수행할 수 있다.

 

데이터베이스는 데이터의 무결성을 유지하기위해 제약조건(PK, FK 등)을 사용했다 트리거는 제약 조건과 더 붙어서 데이터 무결성을 위해서 사용할 수 있는 기능이다.

트리거는 DML문의 이벤트가 발생될때 작동되는 데이터베이스의 개체 중 하나이다.

 

(MySQL은 VIEW에 트리거를 부착할 수 없다 다른 일부 DBMS에는 VIEW에도 트리거를 사용할 수 있다.)

 

트리거는 스토어드 프로시저와 작동이 비슷하지만 직접 실행 시킬수는 없고 오직 해당 테이블의 변경 이벤트가 발생될 경우에만 실행된다. 또한 매개변수도 사용할 수 없다.

 


DELIMITER //
CREATE TRIGGER testTrg
	AFTER insert -- insert 후에 작동하도록 지정
    on Notice
    FOR EACH ROW -- 각 행마다 적용시김
    
BEGIN
SET @msg = '데이터가 추가됨'; -- 트리거가 작동될경우 실행될 코드영역
END //

DELIMITER ; 

INSERT  into Notice(title,writerId) Values('test','testId');
select @msg;

현재는 @msg에 값을 대입하는 내용만 코드로 작성했지만 다른 SQL문으로 대체된다면 유용한 트리거로 사용할 수 있을 것이다.

 

트리거의 종류

 

AFTER 트리거

 

DML문의 작업이 일어났을 때 작동하는 트리거

 

BEFORE 트리거

 

DML문의 작업이 일어나기 전에 작동하는 트리거

 

 

트리거에서 INSERT , DELETE, UPDATE  작업이 수행되면 임시로 사용되는 시스템 테이블이 두 개가 있는데

이름은 NEW, OLD이다.

 

따라서 트리거의 작동 시에 새로 입력/변경되는 새로운 데이터를 잠조하기 위해서는 NEW 테이블을 변경되기 전인 예전 데이터를 참조하기 위해서는 OLD 테이블을 참조하면 된다.

 

중첩 트리거는 하나의 작업으로 2개의 트리거가 연속적으로 작동하는 것이다. 

중첩트리거는 때때로 시스템의 성능에 좋지 않은 영향을 미칠 수 있다. 

예를 들어 고객이 물건을 구매한다고 생각하자.

 

구매 테이블에 INSERT가 되는 순간 트랜잭션이 실행된다. 성공적이라면 COMMIT한뒤 물품 테이블의 물품을 감소하기 위해 UPDATE가 실행되며 다음 배송 테이블에 새 배송 건수를 INSERT 한다. 만약 마지막에서 배송 테이블에 INSERT 하다 작업이 실패한 경우 그 앞의 모든 작업은 자동으로 ROLLBACK 된다. 이러한 것은 시스템의 부담이 되므로 성능에 나쁜 영향을 끼칠 소지가 있다.

 

 

반응형

'Database > MySQL' 카테고리의 다른 글

[MySQL] 커서  (0) 2020.07.01
[MySQL] Stored Program  (0) 2020.07.01
MySQL DATE / TIME TYPE  (0) 2020.05.09
MySQL String Type  (0) 2020.05.09
MySQL Numeric Type  (0) 2020.05.08

댓글