- 데이터베이스에서 변경이 발생했을 때 실행되는 Procedure를 의미
예시1
delimiter $$
CREATE TRIGGER log_user_nickname_trigger
BEFORE UPDATE
ON users FOR EACH ROW
BEGIN
INSERT INTO users_log VALUES(OLD.id, OLD.nickname, now());
END
$$
delimiter;
BEFORE UPDATE ON users FOR EACH ROW
는 users 테이블에 각 row에서 update가 일어나기 전에 수행해야한다는 것을 의미한다.OLD
는 update 전 users의 tuple을 가르킨다.
예시2
delimiter $$
CREATE TRIGGER sum_buy_prices_trigger
AFTER INSERT
ON buy FOR EACH ROW
BEGIN
DECLARE total INT;
DECLARE user_id INT DEFAULT NEW.user_id;
SELECT sum(price) INTO total FROM buy WHERE user_id = user_id;
UPDATE user_buy_stats SET price_sum = total WHERE user_id = user_id;
END
$$
delimiter;
AFTER INSERT ON {table} FOR EACH ROW
는 table에 insert가 발생한 후 수행한다는 것을 의미한다.NEW
는 insert(update)된 이후의 tuple을 가르킨다.- 위에서는
buy
테이블에 insert가 발생하면 insert(update)된 user_id에 대한 price 합계를 가져오고user_buy_stats
에 그 합계를 update한다.
NOTE
postgreSQL에서는 insert, update, delete를 모두 한 번에 감지할 수 있다. 또한 FOR EACH ROW로 적용할 경우 한 번 update할 때 여러 개의 tuple에 변경이 일어난다면 그 개수만큼 Trigger가 작동하기 때문에 비효율적이어서 전체 update가 끝난 후 수행할 수 있도록 FOR EACH STATEMENT를 제공한다.
[reference]