카테고리 없음
[Database] 트리거(Trigger)
8기_이지정
2024. 5. 24. 16:49
트리거(Trigger)
- 트리거는 테이블에 삽입, 수정, 삭제 등의 작업이 발생할 때 자동으로 작동되는 개체
- 테이블에 삽입, 수정, 삭제 작업 후에 작동하는 AFTER 트리거
- 테이블에 삽입, 수정, 삭제 작업 전에 작동하는 BEFORE 트리거
- 트리거를 생성하려면 CREATE TRIGGER 구문을 사용
DELIMITER $$
CREATE [OR REPLACE] TRIGGER 트리거명
BEFORE|AFTER INSERT|UPDATE|DELETE ON 테이블명
FOR EACH ROW
BEGIN
-- SQL 프로그래밍 코드 작성
END $$
DELIMITER ;
더보기
TABLE 작성
-- 트리거 실습
-- 상품 입/출고 관련 예시
-- 1. 상품에 대한 데이터를 보관할 테이블 생성
CREATE TABLE tb_product(
pcode INT AUTO_INCREMENT PRIMARY KEY, -- 상품 코드
pname VARCHAR(100), -- 상품 이름
brand VARCHAR(100), -- 상품의 브랜드 이름
price INT, -- 상품의 가격
stock INT DEFAULT 0 -- 상품의 재고
);
-- 상품 데이터 삽입
INSERT INTO tb_product(pname, brand, price)VALUES('아이폰12미니', '애플', 950000);
INSERT INTO tb_product(pname, brand, price)VALUES('갤럭시23', '삼성', 950000);
##########################################################################################
-- 2. 상품 입/출고 상세 이력 테이블 생성
CREATE TABLE tb_prodetail(
dcode INT AUTO_INCREMENT PRIMARY KEY, -- 입출고 이력 코드
pcode INT REFERENCES tb_product(pcode), -- 상품 코드(외래키)
STATUS VARCHAR(2) CHECK(STATUS IN('입고', '출고')), -- 상태
amount INT, -- 수량
ddate DATE DEFAULT CURDATE() -- 상품 입/출고 일자
);
-- 상품 데이터 삽입
-- 1번 상품이 2024-05-01 날짜로 10개 입고
INSERT INTO tb_prodetail(pcode, STATUS, amount, ddate)
VALUES(1, '입고', 10, '2024-05-01');
## 트리거가 사용되지 않았을때의 입출고 관리
-- 1번 상품이 2024-05-02 날짜로 5개가 출고
INSERT INTO tb_prodetail(pcode, STATUS, amount, ddate)
VALUES(1, '출고', 5, '2024-05-02');
-- 1번 상품의 재고 수량도 변경해야 한다.
UPDATE tb_product
SET stock = stock - 5
WHERE pcode = 1
;
-- 2번 상품이 2024-05-06 날짜로 20개 입고
INSERT INTO tb_prodetail(pcode, STATUS, amount, ddate)
VALUES(2, '출고', 20, '2024-05-06');
-- 2번 상품의 재고 수량도 변경해야 한다.
UPDATE tb_product
SET stock = stock + 20
WHERE pcode = 2
;
## 트리거 생성시에 는 insert 작업만 해주면 됨
DELIMITER $$
CREATE OR REPLACE TRIGGER trg_pro_stock
AFTER INSERT ON tb_prodetail
FOR EACH ROW
BEGIN
-- 상품이 입고된 경우 (재고 증가)
IF NEW.status = '입고' THEN
UPDATE tb_product
SET stock = stock + NEW.amount
WHERE pcode = NEW.pcode;
END IF;
-- 상품이 출고된 경우 (재고 감소)
IF NEW.status = '출고' THEN
UPDATE tb_product
SET stock = stock - NEW.amount
WHERE pcode = NEW.pcode;
END IF;
END;
DELIMITER;
- 트리거를 삭제하려면 DROP TRIGGER 구문을 사용
DROP TRIGGER 트리거 이름;