트리거(Trigger)


 

1. 트리거(Trigger)

  • 트리거는 테이블에 삽입, 수정, 삭제 등의 작업이 발생할 때 자동으로 작동되는 개체

2. 트리거의 종류

  • 테이블에 삽입, 수정, 삭제 작업 후에 작동하는 AFTER 트리거
  • 테이블에 삽입, 수정, 삭제 작업 전에 작동하는 BEFORE 트리거

 

3. 트리거 생성

  • 트리거를 생성하려면 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;

4. 트리거 삭제

  • 트리거를 삭제하려면 DROP TRIGGER 구문을 사용
DROP TRIGGER 트리거 이름;

+ Recent posts