Database

[DATABASE] Trigger

ju_young 2023. 12. 1. 09:55
728x90
  • 데이터베이스에서 변경이 발생했을 때 실행되는 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]

728x90