수업자료/database
[SQL]-TRIGGER
조찬국
2024. 6. 27. 17:31
728x90
1. TRIGGER
💡 SQL에서 트리거는 특정 이벤트가 발생할 때 자동으로 실행되는 특별한 저장 프로시저이다. 이 포스팅에서는 트리거를 활용하여 주문 테이블과 상품 입출고를 관리하는 예제를 정리한다.
1-1. 트리거 정의하기
1-1-1. DELIMITER
트리거를 정의할 때는 문장의 끝을 지정하는 DELIMITER를 변경한다.
DELIMITER // -- 문장의 끝을 지정하는 "//" 문자로 지정.
트리거는 프로시저를 활용하여 이벤트를 처리한다.
예를 들어, 주문 메뉴 테이블(tbl_order_menu)에 주문이 들어올 때마다 주문 테이블(tbl_order)의 총 금액을 업데이트하는 트리거를 작성할 수 있다.
1-1-2. CREATE TRIGGER
사진과 같은 경우에 triiger를 사용한다.
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//
1-1-3. DELIMITER 재설정(;)
트리거를 작성한 후 다시 기본 DELIMITER인 세미콜론(;)으로 돌아간다.
DELIMITER ;
1-1-4. TRIGGER 확인
SHOW TRIGGERS;
1-2. 주문 테이블에 데이터 삽입
먼저 주문 테이블(tbl_order)에 데이터를 삽입한다.
INSERT INTO tbl_order (order_code, order_date, order_time, total_order_price)
VALUES (
NULL,
CONCAT(CAST(YEAR(NOW()) AS CHAR(4)), CAST(LPAD(MONTH(NOW()), 2, '0') AS CHAR(2)), CAST(LPAD(DAYOFMONTH(NOW()), 2, '0') AS CHAR(2))),
CONCAT(CAST(LPAD(HOUR(NOW()), 2, '0') AS CHAR(2)), CAST(LPAD(MINUTE(NOW()), 2, '0') AS CHAR(2)), CAST(LPAD(SECOND(NOW()), 2, '0') AS CHAR(2))),
0
);
1-2-1. TRIGGER 작동 확인
INSERT INTO tbl_order_menu (order_code, menu_code, order_amount) VALUES (1, 2, 3);
INSERT INTO tbl_order_menu (order_code, menu_code, order_amount) VALUES (1, 6, 2);
SELECT * FROM tbl_order;
1-3. 상품 입출고와 관련된 트리거 활용 예제
1-3-1. 이력 테이블 생성
CREATE TABLE product (
pcode INT PRIMARY KEY AUTO_INCREMENT,
pname VARCHAR(30),
brand VARCHAR(30),
price INT,
stock INT DEFAULT 0,
CHECK (stock >= 0)
);
1-3-2. 내역 테이블 생성
CREATE TABLE pro_detail (
dcode INT PRIMARY KEY AUTO_INCREMENT,
pcode INT,
pdate DATE,
amount INT,
STATUS VARCHAR(10) CHECK (STATUS IN ('입고', '출고')),
FOREIGN KEY (pcode) REFERENCES product(pcode)
);
1-3-3. 트리거 작성
상품 입출고 시마다 재고를 업데이트하는 트리거를 작성한다.
DELIMITER //
CREATE OR REPLACE TRIGGER trg_product_after
AFTER INSERT
ON pro_detail
FOR EACH ROW
BEGIN
IF NEW.status = '입고' THEN
UPDATE product
SET stock = stock + NEW.amount
WHERE pcode = NEW.pcode;
ELSEIF NEW.status = '출고' THEN
UPDATE product
SET stock = stock - NEW.amount
WHERE pcode = NEW.pcode;
END IF;
END//
DELIMITER ;
1-3-4. 트리거 확인
트리거가 제대로 작성되었는지 확인하기 위해 다음 명령어를 사용한다.
SHOW TRIGGERS;
1-3-5. 상품 데이터 삽입 및 트리거 작동 확인
먼저 상품 테이블에 데이터를 삽입한다.
INSERT INTO product (pname, brand, price, stock) VALUES ('갤럭시플릿', '삼송', 900000, 5);
INSERT INTO product (pname, brand, price, stock) VALUES ('아이펀15', '아이뽄', 1100000, 5);
INSERT INTO product (pname, brand, price, stock) VALUES ('투명폰', '삼송', 2100000, 5);
다음으로 입출고 내역을 삽입하여 트리거가 작동하는지 확인한다.
INSERT INTO pro_detail (pcode, pdate, amount, STATUS) VALUES (3, CURDATE(), 5, '입고');
INSERT INTO pro_detail (pcode, pdate, amount, STATUS) VALUES (2, CURDATE(), 3, '출고');
트리거가 작동하여 재고가 올바르게 업데이트 되었는지 확인한다.
SELECT * FROM product;
<결과>
이를 통해 트리거가 상품 입출고 시마다 재고를 자동으로 업데이트하는 것을 확인할 수 있다.
728x90