๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Computer Science/Database

12 Trigger

by Dowon Kang 2024. 1. 13.

SQL์—์„œ Trigger(ํŠธ๋ฆฌ๊ฑฐ)๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์ผ๋ จ์˜ SQL ๋ฌธ์„ ํฌํ•จํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ์ด ์ด๋ฒคํŠธ๋Š” ํŠน์ • ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์ž‘์—…(INSERT, UPDATE, DELETE ๋“ฑ)๋“ค์ด ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. 

 

 

BEFORE Trigger

ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์ „์— ์‹คํ–‰๋˜๋Š” Trigger๋กœ, ์ฃผ๋กœ ๋ฐ์ดํ„ฐ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ ์ „์— ์ถ”๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

  1. DELIMITER $$๋Š” ์„ธ๋ฏธ์ฝœ๋ก  ๋Œ€์‹  $$๋กœ ๊ตฌ๋ฌธ ๋ถ„๋ฆฌ์ž๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํŠธ๋ฆฌ๊ฑฐ์˜ ๋ณธ๋ฌธ์€ ์—ฌ๋Ÿฌ SQL ๋ฌธ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ ‡๊ฒŒ ๊ตฌ๋ฌธ ๋ถ„๋ฆฌ์ž๋ฅผ ๋ณ€๊ฒฝํ•ด์ฃผ๋Š” ๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  2. CREATE TRIGGER ๋ฌธ์€ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. 
  3. BEFORE UPDATE: ์ด ํŠธ๋ฆฌ๊ฑฐ๋Š” UPDATE ์ž‘์—…์ด ์ˆ˜ํ–‰๋˜๊ธฐ ์ „์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  4. ON user: ์ด ํŠธ๋ฆฌ๊ฑฐ๋Š” user ํ…Œ์ด๋ธ”์— ๋Œ€ํ•ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  5. FOR EACH ROW: ํŠธ๋ฆฌ๊ฑฐ๋Š” ๊ฐ ๋ ˆ์ฝ”๋“œ๋งˆ๋‹ค ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  6. BEGIN ~ END: ํŠธ๋ฆฌ๊ฑฐ์˜ ๋ณธ๋ฌธ์„ ๊ฐ์‹ธ๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ธ”๋ก์ž…๋‹ˆ๋‹ค.
  7. INSERT INTO users_log (id, name, date) VALUES (OLD.id, OLD.name, NOW()); : ํŠธ๋ฆฌ๊ฑฐ์—์„œ ์‹คํ–‰๋  SQL ๋ฌธ์œผ๋กœ, users_log ํ…Œ์ด๋ธ”์— ๋ณ€๊ฒฝ ์ „(OLD)์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.
  8. $$: ํŠธ๋ฆฌ๊ฑฐ์˜ ๋ณธ๋ฌธ์ด ๋๋‚˜๋ฉด $$๋กœ ์„ค์ •ํ•œ ๊ตฌ๋ฌธ ๋ถ„๋ฆฌ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

user ํ…Œ์ด๋ธ”์— ์œ ์ € ์ด๋ฆ„์„ ์—…๋ฐ์ดํŠธ ํ•˜๋ฉด users_log ํ…Œ์ด๋ธ”์— ๊ธฐ์กด์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ํŠธ๋ฆฌ

 

 


 

AFTER TRIGGER

ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ํ›„์— ์‹คํ–‰๋˜๋Š” Trigger๋กœ, ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ํ›„์— ์ถ”๊ฐ€ ์ž‘์—…์ด๋‚˜ ๋กœ๊น… ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  1. AFTER INSERT ON buy FOR EACH ROW: ์ด ํŠธ๋ฆฌ๊ฑฐ๋Š” buy ํ…Œ์ด๋ธ”์— ํ–‰์ด ์‚ฝ์ž…๋œ ํ›„์— ์‹คํ–‰๋˜๋ฉฐ, ๊ฐ ํ–‰์— ๋Œ€ํ•ด ๋ณ„๋„๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  2. BEGIN ~ END: ์ด ๋ถ€๋ถ„์€ ํŠธ๋ฆฌ๊ฑฐ์˜ ๋ณธ๋ฌธ์„ ๊ฐ์‹ธ๋Š” ๋ธ”๋ก์ž…๋‹ˆ๋‹ค. ์ด ๋ธ”๋ก ์•ˆ์— ํŠธ๋ฆฌ๊ฑฐ์˜ ์‹คํ–‰ ๋กœ์ง์ด ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.
  3. DECLARE total INT;: total์ด๋ผ๋Š” ์ด๋ฆ„์˜ ์ •์ˆ˜ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ณ€์ˆ˜๋Š” ์ด ๊ตฌ๋งค ๊ฐ€๊ฒฉ์„ ์ €์žฅํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  4. DECLARE user_id INT DEFAULT NEW.user_id;: user_id๋ผ๋Š” ์ด๋ฆ„์˜ ์ •์ˆ˜ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ , ์ด ๋ณ€์ˆ˜์—๋Š” ํ˜„์žฌ ํŠธ๋ฆฌ๊ฑฐ์—์„œ ์‚ฝ์ž…๋˜๋Š” ํ–‰์˜ user_id ๊ฐ’์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  5. SELECT sum(price) INTO total FROM buy WHERE user_id = user_id;: buy ํ…Œ์ด๋ธ”์—์„œ ํ˜„์žฌ user_id์— ํ•ด๋‹นํ•˜๋Š” ๋ชจ๋“  ํ–‰์˜ price ๊ฐ’์„ ํ•ฉ์‚ฐํ•˜์—ฌ total ๋ณ€์ˆ˜์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  6. 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 ์ฃผ์˜์‚ฌํ•ญ    

  1. ์„ฑ๋Šฅ ์˜ํ–ฅ: ํŠธ๋ฆฌ๊ฑฐ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ํŠธ๋žœ์žญ์…˜์—์„œ๋Š” ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํŠธ๋ฆฌ๊ฑฐ์˜ ๋ณต์žก์„ฑ์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ํšจ์œจ์ ์ธ ๋กœ์ง์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ฌดํ•œ ๋ฃจํ”„ ํ”ผํ•˜๊ธฐ: ํŠธ๋ฆฌ๊ฑฐ์—์„œ ๋‹ค๋ฅธ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜, ๊ฐ™์€ ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ์ž์‹ ์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ ๋ฌดํ•œ ๋ฃจํ”„์— ๋น ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํŠธ๋ฆฌ๊ฑฐ์˜ ๋กœ์ง์„ ์‹ ์ค‘ํ•˜๊ฒŒ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  3. ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ: ํŠธ๋ฆฌ๊ฑฐ๋Š” ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ๋™์ž‘ํ•˜๋ฉฐ, ๋กค๋ฐฑ ์‹œ์— ํŠธ๋ฆฌ๊ฑฐ์—์„œ ์ˆ˜ํ–‰ํ•œ ์ž‘์—…๋„ ๋กค๋ฐฑ๋ฉ๋‹ˆ๋‹ค. ํŠธ๋ฆฌ๊ฑฐ์˜ ๋™์ž‘์ด ํŠธ๋žœ์žญ์…˜๊ณผ ์ผ์น˜ํ•˜๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  4. ๋ณด์•ˆ ๊ณ ๋ ค: ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ถŒํ•œ์„ ํ™•์ธํ•˜๊ณ , ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์ด ๋ณด์•ˆ ์ •์ฑ…์„ ์ค€์ˆ˜ํ•˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ ์œ ์ง€:
  5. ํŠธ๋ฆฌ๊ฑฐ๋Š” ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ, ์ž˜๋ชป๋œ ํŠธ๋ฆฌ๊ฑฐ ๋กœ์ง์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ผ๊ด€์„ฑ์„ ๊นจ๋œจ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ ์ค‘ํ•œ ๋กœ์ง ์„ค๊ณ„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

 

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

๋Œ“๊ธ€