ํธ๋ฆฌ๊ฑฐ(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
๋ณต์ฌ