예시 1.
사용자의 닉네임 변경 이력을 저장하는 트리거를 작성해 보자
mysql> CREATE TRIGGER log_user_nickname_trigger
-> BEFORE UPDATE
-> ON employee FOR EACH ROW
-> BEGIN
-> insert into users_log values(OLD.id, OLD.name, now());
-> END
-> $$
Query OK, 0 rows affected (0.02 sec)
OLD
예제 2.
사용자가 마트에서 상품을 구매할 때마다 지금까지 누적된 구매 비용을 구하는 트리거를 작성 해보자.
mysql> 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
-> $$
NEW
mysql> select*from user_buy_stats;
+---------+-----------+
| user_id | price_sum |
+---------+-----------+
| 1 | 0 |
+---------+-----------+
1 row in set (0.00 sec)
mysql> insert into buy (id,user_id,price,buy_at) values(1,1,5000,now());
Query OK, 1 row affected (0.00 sec)
mysql> select*from user_buy_stats;
+---------+-----------+
| user_id | price_sum |
+---------+-----------+
| 1 | 5000 |
+---------+-----------+
1 row in set (0.00 sec)
mysql> insert into buy (id,user_id,price,buy_at) values(2,1,15000,now());
Query OK, 1 row affected (0.00 sec)
mysql> select*from buy;
+----+---------+-------+---------------------+
| id | user_id | price | buy_at |
+----+---------+-------+---------------------+
| 1 | 1 | 5000 | 2023-07-26 00:36:13 |
| 2 | 1 | 15000 | 2023-07-26 00:36:59 |
+----+---------+-------+---------------------+
2 rows in set (0.00 sec)
mysql> select*from user_buy_stats;
+---------+-----------+
| user_id | price_sum |
+---------+-----------+
| 1 | 20000 |
+---------+-----------+
1 row in set (0.00 sec)
CREATE TRIGGER avg_empl_salary_trigger
AFTER INSERT OR UPDATE OR DELETE
ON employee
FOR EACH ROW
EXCUTE FUNCTION update_avg_empl_salary();
UPDATE employee SET salary = 1.5 * salary WHERE dept_id = 1003;
// FOR EACH ROW에 의해서 1003 부서에 임직원이 5명이면 trigger은 다섯번 실행된다.
// 비효율적이기 때문에 FOR EACH STATEMENT로 바꿔서 사용한다.
CERATE TRIGGER log_user_nickname_trigger
BEFORE UPDATE
ON users
FOR EACH ROW
WHEN (NEW.nickname IS DISTINCT FROM OLD.nickname)// nickname가 바뀌었을때 조건을 만족하면 실행
EXECUTE FUNCTION log_user_nickname();
12. DBMS에 저장해서 쓰는 함수 3 (0) | 2023.08.28 |
---|---|
11. DBMS에 저장해서 쓰는 함수 2 (0) | 2023.08.25 |
10. DBMS에 저장해서 쓰는 함수 1 (0) | 2023.08.24 |
9. SQL로 데이터 조회하기 5 (0) | 2023.08.23 |
7. SQL로 데이터 조회하기 (0) | 2023.08.21 |