SQL์์ Trigger(ํธ๋ฆฌ๊ฑฐ)๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋ ์๋์ผ๋ก ์คํ๋๋ ์ผ๋ จ์ SQL ๋ฌธ์ ํฌํจํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ฒด์ ๋๋ค. ์ด ์ด๋ฒคํธ๋ ํน์ ํ ์ด๋ธ์ ๋ํ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์์ (INSERT, UPDATE, DELETE ๋ฑ)๋ค์ด ๋ํ์ ์ธ ์์์ ๋๋ค.


BEFORE Trigger
ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๊ธฐ ์ ์ ์คํ๋๋ Trigger๋ก, ์ฃผ๋ก ๋ฐ์ดํฐ์ ์ ํจ์ฑ์ ๊ฒ์ฌํ๊ฑฐ๋ ๋ณ๊ฒฝ ์ ์ ์ถ๊ฐ ์์ ์ ์ํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.

- DELIMITER $$๋ ์ธ๋ฏธ์ฝ๋ก ๋์ $$๋ก ๊ตฌ๋ฌธ ๋ถ๋ฆฌ์๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ํธ๋ฆฌ๊ฑฐ์ ๋ณธ๋ฌธ์ ์ฌ๋ฌ SQL ๋ฌธ์ ํฌํจํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ ๊ฒ ๊ตฌ๋ฌธ ๋ถ๋ฆฌ์๋ฅผ ๋ณ๊ฒฝํด์ฃผ๋ ๊ฒ์ด ํ์ํฉ๋๋ค.
- CREATE TRIGGER ๋ฌธ์ ํธ๋ฆฌ๊ฑฐ๋ฅผ ์์ฑํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- BEFORE UPDATE: ์ด ํธ๋ฆฌ๊ฑฐ๋ UPDATE ์์ ์ด ์ํ๋๊ธฐ ์ ์ ์คํ๋ฉ๋๋ค.
- ON user: ์ด ํธ๋ฆฌ๊ฑฐ๋ user ํ ์ด๋ธ์ ๋ํด ๋์ํฉ๋๋ค.
- FOR EACH ROW: ํธ๋ฆฌ๊ฑฐ๋ ๊ฐ ๋ ์ฝ๋๋ง๋ค ์คํ๋ฉ๋๋ค.
- BEGIN ~ END: ํธ๋ฆฌ๊ฑฐ์ ๋ณธ๋ฌธ์ ๊ฐ์ธ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ธ๋ก์ ๋๋ค.
- INSERT INTO users_log (id, name, date) VALUES (OLD.id, OLD.name, NOW()); : ํธ๋ฆฌ๊ฑฐ์์ ์คํ๋ SQL ๋ฌธ์ผ๋ก, users_log ํ ์ด๋ธ์ ๋ณ๊ฒฝ ์ (OLD)์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํฉ๋๋ค.
- $$: ํธ๋ฆฌ๊ฑฐ์ ๋ณธ๋ฌธ์ด ๋๋๋ฉด $$๋ก ์ค์ ํ ๊ตฌ๋ฌธ ๋ถ๋ฆฌ์๋ฅผ ์ฌ์ฉํ์ฌ ๋์ ํ์ํฉ๋๋ค.


AFTER TRIGGER
ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ํ์ ์คํ๋๋ Trigger๋ก, ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ ๋ณ๊ฒฝ ํ์ ์ถ๊ฐ ์์ ์ด๋ ๋ก๊น ์์ ์ ์ํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.

- AFTER INSERT ON buy FOR EACH ROW: ์ด ํธ๋ฆฌ๊ฑฐ๋ buy ํ ์ด๋ธ์ ํ์ด ์ฝ์ ๋ ํ์ ์คํ๋๋ฉฐ, ๊ฐ ํ์ ๋ํด ๋ณ๋๋ก ์คํ๋ฉ๋๋ค.
- BEGIN ~ END: ์ด ๋ถ๋ถ์ ํธ๋ฆฌ๊ฑฐ์ ๋ณธ๋ฌธ์ ๊ฐ์ธ๋ ๋ธ๋ก์ ๋๋ค. ์ด ๋ธ๋ก ์์ ํธ๋ฆฌ๊ฑฐ์ ์คํ ๋ก์ง์ด ๋ค์ด๊ฐ๋๋ค.
- DECLARE total INT;: total์ด๋ผ๋ ์ด๋ฆ์ ์ ์ ๋ณ์๋ฅผ ์ ์ธํฉ๋๋ค. ์ด ๋ณ์๋ ์ด ๊ตฌ๋งค ๊ฐ๊ฒฉ์ ์ ์ฅํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- DECLARE user_id INT DEFAULT NEW.user_id;: user_id๋ผ๋ ์ด๋ฆ์ ์ ์ ๋ณ์๋ฅผ ์ ์ธํ๊ณ , ์ด ๋ณ์์๋ ํ์ฌ ํธ๋ฆฌ๊ฑฐ์์ ์ฝ์ ๋๋ ํ์ user_id ๊ฐ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํฉ๋๋ค.
- SELECT sum(price) INTO total FROM buy WHERE user_id = user_id;: buy ํ ์ด๋ธ์์ ํ์ฌ user_id์ ํด๋นํ๋ ๋ชจ๋ ํ์ price ๊ฐ์ ํฉ์ฐํ์ฌ total ๋ณ์์ ์ ์ฅํฉ๋๋ค.
- UPDATE user_buy_stats SET price_sum = total WHERE user_id = user_id;: user_buy_stats ํ ์ด๋ธ์์ ํ์ฌ user_id์ ํด๋นํ๋ ํ์ price_sum ๊ฐ์ ์์์ ๊ณ์ฐํ total ๊ฐ์ผ๋ก ์ ๋ฐ์ดํธํฉ๋๋ค.


FOR EACH ROW์ FOR EACH STATEMENT ์ฐจ์ด
FOR EACH ROW
- ๊ฐ๊ฐ์ ํ ์ด๋ธ ๋ ์ฝ๋์ ๋ํด ํธ๋ฆฌ๊ฑฐ๊ฐ ์คํ๋๋๋ก ์ง์ ํฉ๋๋ค. (Ex, ์ง์์ด 5๋ช ์๋ ํ ์ด๋ธ์ด๋ฉด 5๋ฒ ๋์)
- ์ฃผ๋ก ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ด๋ฒคํธ(INSERT, UPDATE, DELETE)์์ ์ฌ์ฉ๋๋ฉฐ, ํ ์ด๋ธ์ ๊ฐ ๋ ์ฝ๋์ ๋ํ ๋์์ ์ ์ํฉ๋๋ค
- ํน์ ๋ ์ฝ๋๊ฐ ์ ๋ฐ์ดํธ๋๊ธฐ ์ ์ด๋ ํ์ ์คํ๋๋ ๋ก์ง์ ์ ์ํ ์ ์์ต๋๋ค.
FOR EACH STATEMENT
- FOR EACH STATEMENT๋ ํธ๋ฆฌ๊ฑฐ๊ฐ ํน์ SQL ๋ฌธ(๋ฌธ์ฅ)์ด ์คํ๋ ๋ ํ ๋ฒ๋ง ์คํ๋๋๋ก ์ง์ ํฉ๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ค์ ์ด๋ฒคํธ๋ ์ฌ๋ฌ ๋ ์ฝ๋๋ฅผ ๋์์ผ๋ก ํ๋ ์ผ๋ฐ์ ์ธ ์์ ์์ ์ฌ์ฉ๋ฉ๋๋ค.
- ์์ฌ๋ฌ ๋ ์ฝ๋๋ฅผ ๋์์ผ๋ก ํ๋ ํต๊ณ ๊ณ์ฐ ๋ฑ์ ์์ ์ ์ ์ํ ์ ์์ต๋๋ค.
TRIGGER ์ฃผ์์ฌํญ
- ์ฑ๋ฅ ์ํฅ: ํธ๋ฆฌ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ํนํ ๋๊ท๋ชจ ํธ๋์ญ์ ์์๋ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก ํธ๋ฆฌ๊ฑฐ์ ๋ณต์ก์ฑ์ ์ต์ํํ๊ณ ํจ์จ์ ์ธ ๋ก์ง์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
- ๋ฌดํ ๋ฃจํ ํผํ๊ธฐ: ํธ๋ฆฌ๊ฑฐ์์ ๋ค๋ฅธ ํธ๋ฆฌ๊ฑฐ๋ฅผ ํธ์ถํ๊ฑฐ๋, ๊ฐ์ ํธ๋ฆฌ๊ฑฐ๊ฐ ์์ ์ ํธ์ถํ๋ ๊ฒฝ์ฐ ๋ฌดํ ๋ฃจํ์ ๋น ์ง ์ ์์ต๋๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ํธ๋ฆฌ๊ฑฐ์ ๋ก์ง์ ์ ์คํ๊ฒ ์์ฑํด์ผ ํฉ๋๋ค.
- ํธ๋์ญ์ ๊ด๋ฆฌ: ํธ๋ฆฌ๊ฑฐ๋ ํธ๋์ญ์ ๋ด์์ ๋์ํ๋ฉฐ, ๋กค๋ฐฑ ์์ ํธ๋ฆฌ๊ฑฐ์์ ์ํํ ์์ ๋ ๋กค๋ฐฑ๋ฉ๋๋ค. ํธ๋ฆฌ๊ฑฐ์ ๋์์ด ํธ๋์ญ์ ๊ณผ ์ผ์นํ๋๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค.
- ๋ณด์ ๊ณ ๋ ค: ํธ๋ฆฌ๊ฑฐ๊ฐ ์คํ๋๋ ๊ถํ์ ํ์ธํ๊ณ , ํธ๋ฆฌ๊ฑฐ๊ฐ ์ํํ๋ ์์
์ด ๋ณด์ ์ ์ฑ
์ ์ค์ํ๋์ง ํ์ธํด์ผ ํฉ๋๋ค.
๋ฐ์ดํฐ ์ผ๊ด์ฑ ์ ์ง: - ํธ๋ฆฌ๊ฑฐ๋ ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ์ ์งํ๋๋ฐ ์ฌ์ฉ๋๋ฏ๋ก, ์๋ชป๋ ํธ๋ฆฌ๊ฑฐ ๋ก์ง์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ผ๊ด์ฑ์ ๊นจ๋จ๋ฆด ์ ์์ต๋๋ค. ์ ์คํ ๋ก์ง ์ค๊ณ๊ฐ ํ์ํฉ๋๋ค.
Trigger๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ์ ๋ฐ๋ผ ๋ฌธ๋ฒ๊ณผ ๋์์ด ์กฐ๊ธ์ฉ ๋ค๋ฅผ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ถ๋ถ์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ์์ ์ง์ํ๊ณ ์์ผ๋ฉฐ, ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉ๋ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ผ๊ด์ฑ๊ณผ ๋ฌด๊ฒฐ์ฑ์ ๊ฐํํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
A trigger is an object in a database that automatically executes a series of SQL statements when a specific event (such as INSERT, UPDATE, DELETE) occurs. Triggers are commonly used to maintain data integrity and perform additional actions in response to data changes.
'Computer Science > Database' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
21 Index (0) | 2024.01.17 |
---|---|
20 Normalization (0) | 2024.01.16 |
9 ORDER BY, GROUP BY (feat. HAVING) (0) | 2024.01.12 |
8 JOIN (0) | 2024.01.12 |
7 READ (Feat. Subquery) (0) | 2024.01.11 |
๋๊ธ