1. 트리거란
트리거의 뜻은 다음과 같습니다.
위 뜻 들의 공통점은 특정한 원인이 있으면 특정한 결과를 만들어낸다는 것
(총은 위협할 대상이 있으면 방아쇠를 당긴다, 도화선은 불을 붙이면 터진다, 촉발시키다는 어떤 자극 주어 어떤 결과를 만든다)
MySQL에서의 Tirrger 동작 또한 다르지 않습니다, 특정 동작(원인)이 있으면 특정 결과를 만들어냅니다.
하나의 SQL 동작을 함과 동시에 그에 맞춰 또 다른 동작을 처리하는 장치라고 할 수 있습니다.
주로 INSERT, UPDATE, DELETE 동작에 쓰입니다.
2. 사용법
트리거 선언
CREATE TRIGGER 트리거명 BEFORE/AFTER 명령 키워드
ON 테이블명 FOR EACH ROW
BEGIN
처리할 내용
END
여기서 BEFORE/AFTER는 명령 키워드가 사용된 후에 처리할지 아니면 끝난 후 처리할지를 나타냅니다.
또한 처리할 내용 부분에서 OLD, NEW로 명령 키워드로 변경되는 테이블에 접근할 수 있습니다.
( OLD : 변경되기 전 테이블, NEW : 변경된 후 테이블 )
3. 예시
저에게는 다음과 같은 members 테이블이 있습니다.
갑자기 해당 테이블에서 데이터를 지울 때 그 데이터를 백업 테이블에 저장하고 싶어 졌습니다.
그럴 경우 트리거 기능을 사용하여 해결할 수 있습니다.
다음과 같이 members에서 삭제한 데이터를 저장할 백업 테이블을 생성합니다.
그다음 아래와 같이 데이터 삭제 시 백업해주는 트리거를 선언합니다.
DELIMITER //
CREATE TRIGGER backup_member BEFORE DELETE
ON members FOR EACH ROW
BEGIN
INSERT INTO members_backup (LastName, FirstName, Address, City, Country)
VALUES (OLD.LastName, OLD.FirstName, OLD.Address, OLD.City, OLD.Country);
END;
//
DELIMITER ;
트리거 명은 backup_member로 선언합니다
프로시저편과 언급한 바와 마찬가지로 트리거에서도 "DELIMITER //"을 이용해서 구분 문자를 바꿨습니다.
이유는 똑같이 BEGIN과 END사이에 ';'이 들어가기 때문에 구분 문자를 바꿈으로써 에러가 발생하지 않게 하는 것입니다.
참고로 MySQL에서 한글을 사용하려면 인코딩 설정을 해야 합니다.
만약 테이블 생성 시 인코딩 설정을 하지 않으셨다면 아래 명령어로 바꾸시면 됩니다.
ALTER TABLE 테이블명 convert to charset utf8;
이제 delete 명령문을 실행해봅시다.
delete from members where ID = 1;
아래와 같이 members 테이블의 데이터는 잘 지워졌으며
members_backup, 백업 테이블에도 잘 저장된 것을 알 수 있습니다.
4. 그 외 문법
트리거 목록 출력
SHOW TRIGGERS;
트리거 삭제
DROP TRIGGER 트리거명;
'MySQL' 카테고리의 다른 글
[MySQL] 실행 계획(Query Plan)이 뭔데 (0) | 2023.12.02 |
---|---|
[MySQL] 뷰(View) 사용법 (0) | 2020.12.30 |
[MySQL] 함수(Function) 사용법 (0) | 2020.12.29 |
[MySQL] 트랜잭션(Transaction) 사용법 (0) | 2020.12.29 |
[MySQL] 프로시저(Procedure) 사용법 (0) | 2020.12.22 |