사전적 의미에서 트리거는 "방아쇠"를 의미하며, 어떤 사건을 유발하는 계기나 작동을 촉발시키는 것을 의미합니다. SQL에서 트리거는 데이터베이스에서 특정 이벤트가 발생했을 때 자동으로 실행되는 프로시저를 말합니다. 다시 말해, 데이터가 변경되었을 때(예: INSERT, UPDATE, DELETE), 이 변경을 계기로 자동으로 실행되는 것이 바로 트리거입니다.
사용자의 닉네임 변경 이력을 저장하는 트리거를 작성해 보겠습니다.
users 테이블에는 사용자 아이디와 닉네임이 저장됩니다.user_logs 테이블에는 사용자가 이전에 사용했던 닉네임 이력이 저장됩니다.user_logs 테이블에 자동으로 저장하고, 새로운 닉네임으로 업데이트해야 합니다.CREATE TRIGGER before_nickname_update
BEFORE UPDATE ON users
FOR EACH ROW
BEGIN
INSERT INTO user_logs (user_id, old_nickname, changed_at)
VALUES (OLD.user_id, OLD.nickname, NOW());
END;
닉네임을 'CodeMaster'에서 'NewCode'로 업데이트하면, 트리거가 실행되어 user_logs 테이블에 'CodeMaster'가 저장되고, users 테이블에는 'NewCode'로 업데이트됩니다.
다음은 사용자가 마트에서 상품을 구매할 때마다 누적된 구매 비용을 계산해 업데이트하는 트리거입니다.
purchases 테이블에는 사용자가 구매한 내역이 저장됩니다.user_stats 테이블에는 사용자의 누적 구매 비용이 저장됩니다.CREATE TRIGGER after_purchase_insert
AFTER INSERT ON purchases
FOR EACH ROW
BEGIN
DECLARE total INT;
DECLARE user_id INT DEFAULT NEW.user_id;
SELECT SUM(amount) INTO total
FROM purchases
WHERE user_id = NEW.user_id;
UPDATE user_stats
SET total_spent = total
WHERE user_id = NEW.user_id;
END;
사용자가 5,000원을 구매하면, user_stats 테이블에 누적 구매 비용이 5,000원으로 업데이트됩니다. 이후 15,000원을 추가로 구매하면, 누적 구매 비용이 20,000원으로 업데이트됩니다.
트리거는 편리한 기능이지만, 사용 시 주의해야 할 점이 많습니다:
트리거는 특정 상황에서 매우 유용한 도구지만, 사용에 신중을 기해야 합니다. 특히, 트리거를 사용할 때는 문서화가 중요하며, 관리와 유지 보수에 어려움이 없도록 최후의 수단으로 사용하는 것이 좋습니다.
https://www.youtube.com/watch?v=aL0XXc1yGPs&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe