๐Ÿฆญ TRIGGER

๋‚˜๋‚˜'s Brainยท2024๋…„ 7์›” 9์ผ

MariaDB

๋ชฉ๋ก ๋ณด๊ธฐ
14/15
post-thumbnail

๐Ÿ“ TRIGGER

๐Ÿ’ก ํŠธ๋ฆฌ๊ฑฐ๋ž€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์—์„œ ๋ฐœ์ƒํ•˜๋Š” ํŠน์ • ์ด๋ฒคํŠธ(INSERT, UPDATE, DELETE)๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ์ฒด์ด๋‹ค.

์ฃผ์š” ์‚ฌ์šฉ ๋ชฉ์ ์€ ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•˜๊ณ  ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.

๋‹ค๋งŒ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ๋‚จ์šฉํ•  ์‹œ ์„ฑ๋Šฅ ๋ฌธ์ œ๋‚˜ ๋ณต์žก์„ฑ ์ฆ๊ฐ€์™€ ๊ฐ™์€ ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

โœ… ํŠธ๋ฆฌ๊ฑฐ์˜ ์ข…๋ฅ˜
BEFORE ํŠธ๋ฆฌ๊ฑฐ
: ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์ „์— ์‹คํ–‰๋˜๋ฉฐ ๋ฐ์ดํ„ฐ์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋‚˜ ๋ณ€ํ˜•์— ์ฃผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.
AFTER ํŠธ๋ฆฌ๊ฑฐ
: ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ํ›„์— ์‹คํ–‰๋˜๋ฉฐ ๋กœ๊น…, ์•Œ๋ฆผ ์ „์†ก ๋“ฑ์˜ ์ž‘์—…์— ์ ํ•ฉํ•˜๋‹ค.

โœ… ํŠธ๋ฆฌ๊ฑฐ ์ž‘์„ฑ๋ฒ•

DELIMITER // 

CREATE OR REPLACE TRIGGER [ํŠธ๋ฆฌ๊ฑฐ๋ช…]
    BEFORE|AFTER [์ด๋ฒคํŠธ ํƒ€์ž…]
    ON [ํ…Œ์ด๋ธ”๋ช…]
    FOR EACH ROW
BEGIN
END//

DELIMITER ;

๐Ÿ”– ํŠธ๋ฆฌ๊ฑฐ ์ƒ์„ฑ

โœ… ์ฃผ๋ฌธ ๋ฉ”๋‰ด(tbl_order_menu) ํ…Œ์ด๋ธ”์— INSERT๊ฐ€ ๋˜๊ณ  ๋‚˜์„œ ์ฃผ๋ฌธ(tbl_order) ํ…Œ์ด๋ธ”์˜ ์ด ํ•ฉ๊ณ„๊ฐ€ UPDATE ๋  ์ˆ˜ ์žˆ๋Š” ํŠธ๋ฆฌ๊ฑฐ ์ƒ์„ฑ

DELIMITER //

CREATE OR REPLACE TRIGGER after_order_menu_insert
    AFTER INSERT
    ON tbl_order_menu
    FOR EACH ROW
BEGIN
    UPDATE tbl_order
    SET total_order_price = total_order_price + NEW.order_amount * (SELECT menu_price FROM tbl_menu WHERE menu_code = NEW.menu_code)
    WHERE order_code = NEW.order_code;
END//

DELIMITER ;

๐Ÿ”– ํŠธ๋ฆฌ๊ฑฐ ํ™œ์šฉ

โœ… ์ฃผ๋ฌธ ํ…Œ์ด๋ธ”๊ณผ ์ฃผ๋ฌธ ๋ฉ”๋‰ด ํ…Œ์ด๋ธ”์— INSERT ์ž‘์—… ์ดํ›„ ์ฃผ๋ฌธ ํ…Œ์ด๋ธ”์˜ ์ด ํ•ฉ๊ณ„๊ฐ€ UPDATE ๋˜๋Š” ๊ฒƒ ํ™•์ธ

-- ์ฃผ๋ฌธ ํ…Œ์ด๋ธ” INSERT
INSERT
  INTO tbl_order
(
  order_code
, order_date
, order_time
, total_order_price
)
VALUES
(
  NULL
, CONCAT(CAST(YEAR(NOW()) AS VARCHAR(4))
	    , CAST(LPAD(MONTH(NOW()), 2, 0) AS VARCHAR(2))
	    , CAST(LPAD(DAY(NOW()), 2, 0) AS VARCHAR(2)))
, CONCAT(CAST(LPAD(HOUR(NOW()), 2, 0) AS VARCHAR(2))
       , CAST(LPAD(MINUTE(NOW()), 2, 0) AS VARCHAR(2))
       , CAST(LPAD(SECOND(NOW()), 2, 0) AS VARCHAR(2)))
, 0			
);

-- ์ฃผ๋ฌธ ๋ฉ”๋‰ด ํ…Œ์ด๋ธ” INSERT 1
INSERT
  INTO tbl_order_menu
(
  order_code
, menu_code
, order_amount
)
VALUES
(
  1
, 3
, 2
);

-- ์ฃผ๋ฌธ ๋ฉ”๋‰ด ํ…Œ์ด๋ธ” INSERT 2
INSERT
  INTO tbl_order_menu
(
  order_code
, menu_code
, order_amount
)
VALUES
(
  1
, 6
, 3
);

SELECT * FROM tbl_order;
SELECT * FROM tbl_order_menu;

-- ๋‹ค์‹œ ๋˜๋Œ๋ ค ํ…Œ์ŠคํŠธ ํ•ด๋ณด๊ณ ์ž ํ•  ๊ฒฝ์šฐ
-- 1) rollbackํ•˜๊ธฐ

ROLLBACK;
-- 2) ๊ธฐ์กด ๋ฐ์ดํ„ฐ ์ง€์šฐ๊ธฐ
DELETE FROM tbl_order WHERE 1 = 1;
DELETE FROM tbl_order_menu WHERE 1 = 1;

-- ์ดํ›„ AUTO_INCREMENT๋„ ๋‹ค์‹œ ์ดˆ๊ธฐํ™” ํ•ด ์ค€๋‹ค.
ALTER TABLE tbl_order AUTO_INCREMENT = 1;
profile
"๋กœ์ปฌ์—์„  ๋ฌธ์ œ์—†์—ˆ๋Š”๋ฐโ€ฆ?"

0๊ฐœ์˜ ๋Œ“๊ธ€