trigger : 데이터베이스에서 어떤 이벤트가 발생했을 때 자동적으로 실행되는 프로시저
즉, 데이터베이스에서 insert, update, delete가 발생했을때 이것이 계기가 되어 자동적으로 실행되는 프로시저를 의미한다.
사용자가 닉네임을 변경했을 때 변경이력을 남기는 트리거 생성
CREATE TRIGGER 트리거명
BEFORE UPDATE //업데이트가 발생하기 전에 실행된다.
ON 테이블명 FOR EACH ROW // 각각의 행마다 실행된다.
// 즉 10개의 행이 업데이트되면 10번 발생
BEGIN
트리거 SQL 구현;
END
OLD : update 되기전의 tuple을 가리키거나 delete된 tuple을 가리킨다. (update 발생 시 변경 전 id와 nickname을 저장한다)
AFTER INSERT : insert가 실행된 후 트리거가 실행된다.
DECLARE : 변수 선언
새로 발생된 NEW.user_id를 user_id의 default값으로 들어간다.
NEW : insert된 tuple을 가리키거나 update 된 후의 tuple을 가리킨다.
select sum(price) into total from buy where user_id = user_id;
//buy에서 조건절에 만족하는 price를 sum으로 합계를 구한 후 변수 total에 대입한다
update 테이블 set price_sum = total where...
// 구매합계 테이블에 존재하는 price_sum 컬럼 데이터를 구매 합계인 total로 변경시킨다
Trigger로 동시에 INSERT, UPDATE, DELETE가 발생하면 실행되게할 수 있다. OR 조건 (MySQL은 불가능하다.)
ex)PostgreSQL
employee 테이블에서 각 행에대해 이벤트(update, delete, insert)가 발생하면 FUNCTION을 실행시키는 트리거
FOR EACH ROW :
부서번호가 1003인 임직원이 5명이 존재하면, 5개의 행에 대해 이벤트가 발생하기 때문에 트리거가 5번 실행된다.
FOR EACH STATEMENT : 각행에대한 이벤트가 아닌 데이터베이스에서 이벤트 1번 발생할때마다 트리거가 실행된다. (MySQL은 불가능하다.)
가시적이지 않아서 개발도, 관리도, 문제 파악도 힘들어진다.
어떤 한 트리거가 다른 트리거를 동작시키고 또 다른 트리거가 영향을 받을 경우. 데이터 변경 이유를 파악하기가 상당히 힘들다.
최대한 사용을 지양한다.