Trigger는 지정된 테이블의 변경을 감지하여 INSERT / UPDATE / DELETE 이벤트가 일어났을 때
설정한 이벤트를 실행하도록 합니다.
예를 들어,
A테이블의 어떤 row의 name 필드의 값이 UPDATE 되면
B테이블의 name 필드도 동일하게 UPDATE 할 수 있습니다.
Trigger는 함수, 핸들러처럼 생성해놓으면 알아서 조건에 맞게 자동으로 실행됩니다.
Trigger 생성 예제
1) 할인 테이블에 할인율 필드가 업데이트 되면 상품 테이블의 할인율도 똑같이 적용하고 싶을 때
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
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 ; 명령을 통해 구분자를 복원시킵니다.
'CS 기초 > Database' 카테고리의 다른 글
mariaDB 개인 메모 (0) | 2019.10.22 |
---|
댓글