μΌ | μ | ν | μ | λͺ© | κΈ | ν |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- μκ³ λ¦¬μ¦
- νλ‘κ·Έλλ¨Έμ€
- λ°±μ€
- 그리λ
- ν°μ€ν 리μ±λ¦°μ§
- λμ ν©
- λμ κ³νλ²
- DP
- μ λ ¬
- SQL
- μμνμ
- νμ΄μ¬
- κ·Έλννμ
- DFS
- μ€λΈμ
- ꡬν
- BFS
- λ°μ΄ν°λ² μ΄μ€
- skala1κΈ°
- λλΉμ°μ νμ
- LIS
- λ€μ΄λλ―Ήνλ‘κ·Έλλ°
- λ³ν©μ λ ¬
- skala
- κ·Έλν
- λ¨Έμ§μνΈ
- db
- SK
- κΉμ΄μ°μ νμ
- μν
- Today
- Total
πππ°πΈ π£πΆπ΅ π΄π΅π¦π’π₯πΊ
[λ°μ΄ν°λ² μ΄μ€/DB] Stored Procedure vs Trigger? λ³Έλ¬Έ
[λ°μ΄ν°λ² μ΄μ€/DB] Stored Procedure vs Trigger?
.23 2025. 4. 12. 00:46λμ λ Έ νλ‘μμ Έ ?
π Stored Procedure(μ μ₯ νλ‘μμ )
μμ£Ό μ¬μ©νλ SQLλ¬Έμ νλμ μ΄λ¦μΌλ‘ λ¬Άμ΄μ μ μ₯νλ λ°©λ²μΌλ‘, νμν λ λ§λ€ νΈμΆνμ¬ μ€νν μ μλ νλ‘κ·Έλ¨ κ°μ²΄λ₯Ό μλ―Ένλ€. μ£Όλ‘ λ°λ³΅λλ λ‘μ§μ 'μ¬μ¬μ©' νκ±°λ, 볡μ‘ν νΈλμμ μ²λ¦¬λ₯Ό μν΄ μ¬μ©λλ€.
μ΄λ κ² λ§νλ©΄ μ΄λ €μ΄λ° λλ¦ λ§€κ°λ³μμ κ°λ λ μκ³ , μ¬μ¬μ©μ±μ μν΄ νμ©λλ€λ μ μμ μΌμ’ μ method/ν¨μμ μ μ¬ν κ΅¬μ‘°λ‘ μλνλ€.
νΉμ§μΌλ‘λ μ λ ₯(IN), μΆλ ₯(OUT), μ μΆλ ₯(INOUT)μ κ°λ μ΄ μ‘΄μ¬νκ³ , IF/WHILE/LOOP/CASE λ±μ μ μ΄λ¬Έ μ¬μ©λ κ°λ₯νλ€.
νλ‘μμ λ ꡬν λ° λλ²κΉ μ΄ μ΄λ ΅λ€λ νκ³μ λ μμΌλ, λ‘μ§ μΊ‘μν, μ€λ³΅ μ κ±°, μ±λ₯ ν₯μ λ± μ μ§λ³΄μ λ©΄μμ λͺ νν μ₯μ μ΄ μ‘΄μ¬νλ€.
μ½λ μμ
μν©: μΌνλͺ° κ΄λ¦¬ DBλ₯Ό λ§λ€μλ€κ³ κ°μ ν λ, μν μ£Όλ¬Έ μ μ¬κ³ κ° μμ κ²½μ° μ¬κ³ κ° μλ€λ λ©μμ§λ₯Ό μΆλ ₯νλ νλ‘μμ λ₯Ό μμ±ν΄λ³΄μλ€.
DELIMITER //
CREATE PROCEDURE PlaceOrder(
IN p_ProductID INT,
IN p_Quantity INT
)
μ΄μ κ°μ΄ PlaceOrder λΌλ μ΄λ¦μ νλ‘μμ λ₯Ό μ μνκ³ , μ λ ₯(IN) 맀κ°λ³μλ‘ λ°μ μνμ ID(p_ProductID), ꡬ맀 ν¬λ§ μλ(p_Quantity)μ λ¨Όμ μ μνλ€.
μ°Έκ³ λ‘ DELIMITER // λΌλ κ²μ.. ..
μλ SQLμμ μ€ν λ¨μλ₯Ό μΈλ―Έμ½λ‘ ; μΌλ‘ ꡬλΆνμ§λ§, νλ‘μμ μμλ λ€μν SQLλ¬Έλ€μ΄ νλμ λΈλ‘μΌλ‘ ꡬμ±λκΈ° λλ¬Έμ, μΏΌλ¦¬λ¬Έμ΄ μ€κ°μ μ€νλλ€ μ리λ μΌμ΄ μλλ‘ νλμ μ€ν λ¨μλ₯Ό DELIMITER λ€μ μ μΈνλ κΈ°νΈλ‘ ꡬλΆνκ² λ€λ μλ―Έμ΄λ€.
DELIMITER // λ©΄ λ€μ //μ΄ λμ¬λκΉμ§κ° ν λΈλ‘μ΄λΌλ μλ―Έ!
BEGIN
DECLARE v_Stock INT;
DECLARE v_OrderID INT;
-- νμ¬ μ¬κ³ νμΈ
SELECT Stock INTO v_Stock
FROM Product_SP
WHERE ProductID = p_ProductID;
-- μ¬κ³ κ° μκ±°λ λΆμ‘±ν κ²½μ°
IF v_Stock IS NULL OR v_Stock < p_Quantity THEN
INSERT INTO Order_Log (OrderID, LogMessage)
VALUES (NULL, CONCAT('ProductID ', p_ProductID, ' - μ¬κ³ λΆμ‘±μΌλ‘ μ£Όλ¬Έ μ€ν¨'));
ELSE
-- μ£Όλ¬Έ μμ±
INSERT INTO `Order` (ProductID, Quantity)
VALUES (p_ProductID, p_Quantity);
-- λ§μ§λ§ μ£Όλ¬Έ λ²νΈ κ°μ Έμ€κΈ°
SET v_OrderID = LAST_INSERT_ID();
-- μ¬κ³ μ°¨κ°
UPDATE Product_SP
SET Stock = Stock - p_Quantity
WHERE ProductID = p_ProductID;
-- λ‘κ·Έ κΈ°λ‘
INSERT INTO Order_Log (OrderID, LogMessage)
VALUES (v_OrderID, CONCAT('ProductID ', p_ProductID, ' μ£Όλ¬Έ μ±κ³΅, μλ: ', p_Quantity));
END IF;
END;
//
DELIMITER ;
λ€μ BEGIN ~ END λΆλΆμμ μ€ν λ‘μ§μ μ μνλ€.
DECLAREλ₯Ό ν΅ν΄ λ³Έλ¬Έ μμμ μ¬μ©ν λ‘컬 λ³μλ₯Ό μ μΈνκ³ (λͺ λ Ήμ΄ μ§μ§ μ§κ΄μ μ), μνλ λ‘μ§λλ‘ μΏΌλ¦¬λ¬Έμ ꡬμ±νλ€.
μ°μ μ£Όλ¬Ένλ €λ μνμ νμ¬ μ¬κ³ λ₯Ό κ°κ³ μ€κΈ° μν΄ Product_SP ν μ΄λΈμμ v_Stockμ΄λΌλ λ³μμ Stockμ ν λΉν΄μ£Όκ³ ,
미리 맀κ°λ³μλ‘ μ λ ₯λ°μ p_Quantityλ³΄λ€ v_Stockμ΄ μ κ±°λ μ λ³΄κ° μμΌλ©΄ log ν μ΄λΈμ μ£Όλ¬Έ μ€ν¨νλ€λ κΈ°λ‘μ, μ£Όλ¬Έ κ°λ₯ν κ²½μ° μ£Όλ¬Έ λ΄μκ³Ό μλ μ 보λ₯Ό μ λ ₯νλ€.
μ΄ν μ£Όλ¬Ένλ €λ μλκ³Ό μ£Όλ¬Ένλ €λ κ°μλ§νΌ μ«μλ κ°μ λ΄μ
CALL PlaceOrder(1, 2);
CALL PlaceOrder(2, 1);
CALL PlaceOrder(5, 15);
-- ....
μ κ°μ΄ μ¬μ©ν κ²½μ°, λ€μκ³Ό κ°μ΄ λ‘κ·Έκ° λ¨λ κ²μ νμΈν μ μλ€.
π Trigger(νΈλ¦¬κ±°)
νΈλ¦¬κ±°λ νΉμ μ΄λ²€νΈ(INSERT, UPDATE, DELETE λ±)κ° ν μ΄λΈμμ λ°μν λ μλμΌλ‘ μ€νλλ SQL λΈλ‘μ΄λ€.
μΌμ’ μ onClickκ³Ό κ°μ μ΄λ²€νΈ 리μ€λ μν μ μννκΈ° λλ¬Έμ, κ°μ¬ λ‘κ·Έ(audit log)λ₯Ό μλ κΈ°λ‘νκ±°λ, λ°μ΄ν° 무결μ±μ 보쑰νκ±°λ μλ¦Ό κΈ°λ₯μ νλ λ± κ°λ¨ν μμ μ μλμΌλ‘ μνν λ μ μνλ©΄ μ’λ€.
μ½λ μμ
μ¬μ€ μμμ νλ‘μμ λ‘ λ³΄μ¬μ€ μμμ²λΌ μ£Όλ¬Έ λ°μ μ μ£Όλ¬Έ μ 보μ λν λ‘κ·Έλ₯Ό λ¨κΈ°λ μ λμ μ‘μ μ νΈλ¦¬κ±°λ‘ μμ±νλ κ²μ΄ μΌλ°μ μ΄λ€.
DELIMITER //
CREATE TRIGGER trg_after_order_insert
AFTER INSERT ON `Order`
FOR EACH ROW
BEGIN
INSERT INTO Order_Log (OrderID, LogMessage)
VALUES (NEW.OrderID, CONCAT('μ£Όλ¬Έ λ²νΈ ', NEW.OrderID, 'μ΄ μμ±λμμ΅λλ€.'));
END;
//
DELIMITER ;
AFTER INSERT ON `Order` λ₯Ό ν΅ν΄ 'INSERT' actionμ΄ λ°μν λ κ° νλ§λ€(For Each Row) BEGIN ~ END μ¬μ΄μ κΈ°λ‘λ μΏΌλ¦¬λ¬Έμ΄ μ€νλλ νΈλ¦¬κ±°λ₯Ό μμ±ν΄μ€λ€.
κ·Έλ¬λ©΄,
INSERT INTO `Order` (ProductID, Quantity)
VALUES (2, 1);
μ΄μ²λΌ trigger μ΄λ¦μ κ΅³μ΄ λͺ μνμ§ μμλ `Order` ν μ΄λΈμ INSERTλ¬Έμ΄ μ€νλλ©΄ μλμΌλ‘ Order_Logμ κΈ°λ‘μ΄ λ¨κ² λλ€.
LogID 1 ~ 5κΉμ§κ° νλ‘μμ λ₯Ό ν΅ν΄ κΈ°λ‘λ λ‘κ·Έ, LogID 6λ²μ΄ insertλ₯Ό μννμ λ νΈλ¦¬κ±°λ₯Ό ν΅ν΄ κΈ°λ‘λ λ‘κ·Έμ΄λ€.
μ λ§ κ°λ¨νμ£ ?
κ·Έλ¬λ!!!!!!!
SQLμ μ΄λκΉμ§λ λ°μ΄ν°λ₯Ό κ°μ Έμ€κ³ μ²λ¦¬νλ λ° μ΅μ νλ μΈμ΄μΌ λΏ, μ¦μ μ°μ°μ΄λ νλ¦ μ μ΄ λ± 'μ μ°¨ν μ μ΄'μλ νκ³κ° μλ€.
λ°λΌμ 무ν±λκ³ λͺ¨λ λ¨μ μμ μ νλ‘μμ λ νΈλ¦¬κ±°λ₯Ό μ μνλ κ²μ μ§μν΄μΌ ν κ²μ΄λ€.
π μ 리