Search

ํŠธ๋ฆฌ๊ฑฐ

ํŠธ๋ฆฌ๊ฑฐ(Trigger)

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํŠน์ • ์ด๋ฒคํŠธ(INSERT, UPDATE, DELETE)๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์ €์žฅ ํ”„๋กœ๊ทธ๋žจ

ํŠน์ง•

โ€ข
ํŠน์ • ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์ด๋ฒคํŠธ(INSERT, UPDATE, DELETE)๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ์ž๋™์œผ๋กœ ์‹คํ–‰๋จ
โ€ข
๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ
โ€ข
์—ฐ๊ด€๋œ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ์Œ
โ€ข
์ž‘์—…์˜ ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•˜๋Š”๋ฐ ํ™œ์šฉ ๊ฐ€๋Šฅ
โ€ข
ํŠธ๋žœ์žญ์…˜ ์ œ์–ด๋ฌธ(COMMIT, ROLLBACK)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ

์ฝ”๋“œ

1. ํŠธ๋ฆฌ๊ฑฐ ์ƒ์„ฑ

DELIMITER // CREATE TRIGGER trigger_name {BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON table_name FOR EACH ROW BEGIN -- ํŠธ๋ฆฌ๊ฑฐ ๋‚ด์šฉ END // DELIMITER ;
SQL
๋ณต์‚ฌ
ํ•ญ๋ชฉ
์„ค๋ช…
CREATE TRIGGER trigger_name
ํŠธ๋ฆฌ๊ฑฐ ์ƒ์„ฑ์ด ์‹œ์ž‘๋˜๋Š” ๊ตฌ๋ฌธ์œผ๋กœ ํŠธ๋ฆฌ๊ฑฐ ์ด๋ฆ„์„ ์ง€์ •
{BEFORE | AFTER}
ํŠธ๋ฆฌ๊ฑฐ ์‹คํ–‰ ์‹œ์  : BEFORE(์ด์ „), AFTER(์ดํ›„)
{INSERT | UPDATE | DELETE}
ํŠธ๋ฆฌ๊ฑฐ ์ด๋ฒคํŠธ ์ง€์ • : INSERT, UPDATE, DELETE
ON table_name FOR EACH ROW
ํŠธ๋ฆฌ๊ฑฐ ์ ์šฉ ํ…Œ์ด๋ธ” ์ง€์ •
BEGIN ~ END
ํŠธ๋ฆฌ๊ฑฐ ์‹œ์ž‘ ~ ๋ ์ง€์ •
NEW
์ƒˆ๋กœ์šด ๊ฐ’
OLD
์ด์ „ ๊ฐ’

2. ํŠธ๋ฆฌ๊ฑฐ ์‚ญ์ œ

DROP TRIGGER [IF EXISTS] trigger_name;
SQL
๋ณต์‚ฌ

ํŠธ๋ฆฌ๊ฑฐ ์‚ฌ์šฉ ์˜ˆ์‹œ

DELIMITER // CREATE TRIGGER after_order_insert AFTER INSERT ON orders FOR EACH ROW BEGIN UPDATE product SET stock = stock - NEW.quantity WHERE product_id = NEW.product_id; END // DELIMITER ;
SQL
๋ณต์‚ฌ

employees ์Šคํ‚ค๋งˆ๋ฅผ ์‚ฌ์šฉํ•œ ํŠธ๋ฆฌ๊ฑฐ ์˜ˆ์‹œ

์ง์›์˜ ๊ธ‰์—ฌ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ๊ธ‰์—ฌ ์ด๋ ฅ์„ ์ž๋™์œผ๋กœ ๊ธฐ๋กํ•˜๋Š” ํŠธ๋ฆฌ๊ฑฐ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.
DELIMITER // -- ๊ธ‰์—ฌ ์ด๋ ฅ ํ…Œ์ด๋ธ” ์ƒ์„ฑ CREATE TABLE salary_history ( emp_no INT NOT NULL, old_salary DECIMAL(10,2), new_salary DECIMAL(10,2), changed_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- ๊ธ‰์—ฌ ๋ณ€๊ฒฝ ์‹œ ์ด๋ ฅ์„ ๊ธฐ๋กํ•˜๋Š” ํŠธ๋ฆฌ๊ฑฐ CREATE TRIGGER after_salary_update AFTER UPDATE ON salaries FOR EACH ROW BEGIN INSERT INTO salary_history (emp_no, old_salary, new_salary) VALUES (OLD.emp_no, OLD.salary, NEW.salary); END // DELIMITER ;
SQL
๋ณต์‚ฌ
์ง์›์ด ๋ถ€์„œ๋ฅผ ์ด๋™ํ•  ๋•Œ ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ํŠธ๋ฆฌ๊ฑฐ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.
DELIMITER // -- ๋ถ€์„œ ์ด๋™ ๋กœ๊ทธ ํ…Œ์ด๋ธ” ์ƒ์„ฑ CREATE TABLE dept_transfer_log ( emp_no INT NOT NULL, old_dept_no CHAR(4), new_dept_no CHAR(4), transfer_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- ๋ถ€์„œ ์ด๋™ ์‹œ ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ํŠธ๋ฆฌ๊ฑฐ CREATE TRIGGER after_dept_transfer AFTER UPDATE ON dept_emp FOR EACH ROW BEGIN INSERT INTO dept_transfer_log (emp_no, old_dept_no, new_dept_no) VALUES (OLD.emp_no, OLD.dept_no, NEW.dept_no); END // DELIMITER ;
SQL
๋ณต์‚ฌ