[MariaDB,MySQL] Trigger 사용법 / 특정 테이블 변경 시 관련 테이블 이벤트 실행

DongHo Im·2022년 1월 11일
0

SQL

목록 보기
1/11
post-thumbnail

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 트리거명;
profile
[DATABASE] 비전공자 출신의 개발 도전!

1개의 댓글

comment-user-thumbnail
2022년 12월 30일

출처는 남기세요

답글 달기