반응형
Trigger란?
- 위 뜻 들의 공통점은 특정한 원인이 있으면 특정한 결과를 만들어낸다는 것 (총은 위협할 대상이 있으면 방아쇠를 당긴다, 도화선은 불을 붙이면 터진다, 촉발시키다는 어떤 자극 주어 어떤 결과를 만든다)
- MySQL에서의 Tirrger 동작 또한 다르지 않습니다, 특정 동작(원인)이 있으면 특정 결과를 만들어냅니다.
- 하나의 SQL 동작을 함과 동시에 그에 맞춰 또 다른 동작을 처리하는 장치라고 할 수 있습니다.
- 주로 INSERT, UPDATE, DELETE 동작에 쓰입니다.
-
- Trigger는 지정된 테이블의 변경을 감지하여 INSERT / UPDATE / DELETE 이벤트가 일어났을 때 설정한 이벤트를 실행하도록 합니다.
- A테이블의 어떤 row의 name 필드의 값이 UPDATE 되면 B테이블의 name 필드도 동일하게 UPDATE 할 수 있습니다.
- Trigger는 함수, 핸들러처럼 생성해놓으면 알아서 조건에 맞게 자동으로 실행됩니다.
Trigger 사용법
- 트리거 선언
CREATE TRIGGER 트리거명 BEFORE/AFTER 명령 키워드
ON 테이블명 FOR EACH ROW
BEGIN
처리할 내용
END
- 여기서 BEFORE/AFTER는 명령 키워드가 사용된 후에 처리할지 아니면 끝난 후 처리할지를 나타냅니다.
- 또한 처리할 내용 부분에서 OLD, NEW로 명령 키워드로 변경되는 테이블에 접근할 수 있습니다.
- ( OLD : 변경되기 전 테이블, NEW : 변경된 후 테이블 )
Trigger 생성 예제
- 할인 테이블에 할인율 필드가 업데이트 되면 상품 테이블의 할인율도 똑같이 적용하고 싶을 때
DELIMITER //
CREATE TRIGGER update_item
AFTER
UPDATE ON sale_table
FOR EACH ROW
BEGIN
IF NEW.discount_rate != OLD.discount_rate THEN
UPDATE item_table SET discount_rate = NEW.discount_rate
WHERE discount_rate = OLD.discount_rate;
END IF;
END; //
DELIMITER ;
DELIMITER //
- 문장 구분자를 '//'로 설정한다는 뜻입니다. 원래 명령문 또는 쿼리를 사용할 때 세미콜론 ';' 으로 구분하는데 Trigger 생성 시 IF문 등에서 ';'를 사용하려고 임시로 구분자를 //로 변경하는 것입니다.
CREATE TRIGGER update_item
- CREATE TRIGGER [트리거 이름]
AFTER UPDATE ON sale_table
- AFTER UPDATE ON [변경을 감지할 테이블]
- 해당 테이블에 UPADTE 이벤트가 실행된 후
FOR EACH ROW
- 아래 나올 조건에 해당하는 모든 row에 적용한다는 뜻입니다.
BEGIN ~ END
BEGIN
IF 조건1 THEN
Query문;
ELSE IF 조건 2 THEN
Query문;
ELSE
Query문;
END IF;
END; //
- BEGIN~END 사이에 조건문과 실행문을 작성합니다.
- sale_table 테이블의 변경 전/후를 기준으로 필드 앞에 변경 전은 OLD, 변경 후는 NEW 키워드가 붙습니다.
- 따라서 IF NEW.discount_rate != OLD.discount_rate THEN의 의미는 sale_table의 변경 후 discount_rate 필드의 값과 변경 전 discount_rate 필드의 값이 불일치한다는 조건을 의미합니다.
- 이 조건을 만족하는 row는 IF문 아래 작성된 UPDATE 쿼리문을 실행하게 됩니다.
IF문 또는 ELSE IF문 또는 ELSE 문 작성이 완료 되었으면 END IF로 IF문 종료를 알립니다. - 이렇게 Trigger를 생성하고나면 구분자가 //로 설정되어 있기 때문에 원래대로 DELEMITER; 명령을 통해 구분자를 복원시킵니다.
그 외 문법
트리거 목록 출력
SHOW TRIGGERS;
트리거 삭제
DROP TRIGGER 트리거명;
반응형
'DB > MySQL' 카테고리의 다른 글
[MySQL] 저장 프로시저 (Stored Procedure) (0) | 2022.04.01 |
---|---|
[MySQL] 두 날짜 사이 일수, 주말(평일) 일수 구하기 (0) | 2022.04.01 |
[MySQL] 왜래키(Foreign Key) 정리 (0) | 2022.04.01 |
[MySQL] 시간 더하기, 빼기 (DATE_ADD, DATE_SUB 함수) (0) | 2022.04.01 |
[MySQL] DATETIME 원하는 유형으로 변경 (YYMMDD) (0) | 2022.04.01 |