Trigger

ํŠธ๋ฆฌ๊ฑฐ(Trigger)๋Š” ํ…Œ์ด๋ธ”์—์„œ ์–ด๋–ค ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜์™€ ๊ฐ™์€ ์กด์žฌ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์ฒ˜๋Ÿผ ์–ด๋–ค ํ…Œ์ด๋ธ”์—์„œ ํŠน์ •ํ•œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์‹คํ–‰์‹œํ‚ค๊ณ ์ž ํ•˜๋Š” ์ถ”๊ฐ€ ์ฟผ๋ฆฌ ์ž‘์—…๋“ค์„ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ๋” ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ๋ฏธ๋ฆฌ ์„ค์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

์ •๋ง ๊ฐ„๋žตํ•˜๊ฒŒ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด์ž๋ฉด, A ํ…Œ์ด๋ธ”์— 1์ด๋ผ๋Š” ์ˆซ์ž๊ฐ€ ์ž…๋ ฅ๋์„ ๋•Œ, ์ž๋™์œผ๋กœ B ํ…Œ์ด๋ธ”์—๋„ 1์„ ๋ณต์‚ฌํ•ด์ฃผ๊ณ  ์‹ถ์„ ๋•Œ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์ด์šฉํ•ด ์„ค์ •ํ•ด ๋†“์•˜๋‹ค๋ฉด ์ž๋™์œผ๋กœ B์—๋„ 1์ด๋ผ๋Š” ์ˆซ์ž๊ฐ€ ์ž…๋ ฅ๋˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Trigger ์ข…๋ฅ˜

๋ฌธ์žฅ ํŠธ๋ฆฌ๊ฑฐ

  • INSERT, UPDATE, DELETE ๋ฌธ์— ๋Œ€ํ•ดย ํ•œ ๋ฒˆ๋งŒย ์‹คํ–‰
  • AFTER ํŠธ๋ฆฌ๊ฑฐ : ์ฟผ๋ฆฌ ์ด๋ฒคํŠธ ์ž‘๋™ํ•œ ํ›„
  • BEFORE ํŠธ๋ฆฌ๊ฑฐ : ์ฟผ๋ฆฌ ์ด๋ฒคํŠธ๊ฐ€ ์ž‘๋™ํ•˜๊ธฐ ์ „ โ†’ ๋ฏธ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธ ๊ฐ€๋Šฅํ•  ๋•Œ

ํ–‰ ํŠธ๋ฆฌ๊ฑฐ

  • ํ…Œ์ด๋ธ” ์•ˆ์˜ ์˜ํ–ฅ์„ ๋ฐ›์€ ํ–‰ ๊ฐ๊ฐ์— ๋Œ€ํ•ด ์‹คํ–‰
  • ๋ณ€๊ฒฝ ์ „ or ๋ณ€๊ฒฝ ํ›„์˜ ํ–‰์€ ๊ฐ๊ฐย OLD, NEW๋ผ๋Š” ๊ฐ€์ƒ ์ค„ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ์–ด์˜ด
    • OLD : ๊ธฐ์กด ๋ฐ์ดํ„ฐ, delete๋กœ ์‚ญ์ œ ๋œ ๋ฐ์ดํ„ฐ ๋˜๋Š” update๋กœ ๋ฐ”๋€Œ๊ธฐ ์ „์˜ ๋ฐ์ดํ„ฐ
    • NEW : ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ, insert๋กœ ์‚ฝ์ž…๋œ ๋ฐ์ดํ„ฐ ๋˜๋Š” update๋กœ ๋ฐ”๋€ ํ›„์˜ ๋ฐ์ดํ„ฐ
ํŠธ๋ฆฌ๊ฑฐ ์ด๋ฒคํŠธOLDNEW
INSERTXO
UPDATEOO
DELETEOX
  • INSERT - ์ƒˆ๋กญ๊ฒŒ ๋ฐ์ดํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์ด์ „ ๋ฐ์ดํ„ฐ๋Š” ์กด์žฌํ•˜์ง€ ์•Š์•„ OLD X, NEW O ์ž…๋‹ˆ๋‹ค.
  • UPDATE - ๊ธฐ์กด์— ์žˆ๋˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ์ž‘์—…์ด๊ธฐ ๋•Œ๋ฌธ์— OLD O, NEW O ์ž…๋‹ˆ๋‹ค.
  • DELETE - ๊ธฐ์กด์— ์žˆ๋˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์šฐ๋Š” ์ž‘์—…์ด๋ฏ€๋กœ OLD O, NEW X ์ž…๋‹ˆ๋‹ค.

Trigger ์‚ฌ์šฉ๋ฒ•

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

DELIMITER $$
 
CREATE TRIGGER before_to_after -- before_to_after๋ผ๋Š” Trigger ์ด๋ฆ„
AFTER INSERT ON before_num -- {BEFORE | AFTER} {INSERT | UPDATE | DELETE}์ค‘ ์–ธ์ œ ์–ด๋–ค ์ž‘์—…์„ ํ•  ์ง€ ์ •ํ•ด์ค๋‹ˆ๋‹ค.
FOR EACH ROW -- ์•„๋ž˜ ๋‚˜์˜ฌ ์กฐ๊ฑด์— ํ•ด๋‹นํ•˜๋Š” ๋ชจ๋“  row์— ์ ์šฉํ•œ๋‹ค๋Š” ์˜๋ฏธ
 
BEGIN
	-- Trigger๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ
	IF NEW.number THEN -- ์ƒˆ๋กœ์šด number๊ฐ€ ์ž…๋ ฅ๋์„ ๋•Œ,
		INSERT INTO after_num(id, number) VALUES(NEW.id, NEW.number); -- `VALUES(NEW.id, NEW.number)`์˜ ๋ฐ์ดํ„ฐ๋ฅผ after_num์˜ id, number์— ์‚ฝ์ž…
	END IF;
END $$
  • BEGIN ~ END ์‚ฌ์ด์— ์กฐ๊ฑด๋ฌธ๊ณผ ์‹คํ–‰๋ฌธ์„ ์ž‘์„ฑ
  • delimiter(๊ตฌ๋ฌธ ๋ฌธ์ž, ๋ฌธ๋ฒ•์˜ ๋) ๋ช…์‹œ(๋Œ€๋ถ€๋ถ„ $$๋ฅผ ๋งŽ์ด ์”€)

ํŠธ๋ฆฌ๊ฑฐ ์‹คํ–‰

Trigger before_to_after๋Š”ย AFTER INSERT ON before_num๊ฐ€ ์‹คํ–‰๋˜๋ฉด ์ž๋™์œผ๋กœ ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๊ตฌ์กฐ์ด๊ธฐ ๋•Œ๋ฌธ์—, before_num ํ…Œ์ด๋ธ”์— ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

INSERT INTO before_num(number) VALUES(1);

ํŠธ๋ฆฌ๊ฑฐ ํ™•์ธ

  • ์•ž์„œ ๋งŒ๋“ค์—ˆ๋˜ Trigger ์ด๋ฆ„๊ณผ ๋ช…๋ น ๋“ฑ ์ •๋ณด๋“ค์„ ํ™•์ธ
SHOW triggers;

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

-- ์ „๋ถ€ ์‚ญ์ œ
DELETE TRIGGERS;
 
-- ํ•˜๋‚˜๋งŒ ์‚ญ์ œ
DROP TRIGGET ํŠธ๋ฆฌ๊ฑฐ์ด๋ฆ„;

๋ณ€์ˆ˜ ์ƒ์„ฑ

  • ๋ณ€์ˆ˜ ์„ ์–ธ์€ย DECLAREย ๋ช…๋ น์„ ์ด์šฉํ•ด ์‚ฌ์šฉ
  • BEGIN ~ END ์‚ฌ์ด์— ์ž‘์„ฑ
-- DECLARE ์„ ์–ธ ๋ฐฉ๋ฒ• 
BEGIN
	DECLARE ๋ณ€์ˆ˜ ํƒ€์ž… {๋””ํดํŠธ๊ฐ’}
    .
    .
    .
END

์กฐ๊ฑด๋ฌธ

IF (์กฐ๊ฑด) THEN
ELSEIF (์กฐ๊ฑด) THEN
ELSE
ENDIF