[학습목표]
💡 내가 지정한 특정 테이블에 INSERT, UPDATE, DELETE 등의 DML문에 의해 변경사항이 생길 때 매번 자동으로 실행시킬 내용을 미리 정의해둘 수 있는 객체이다.
📢 ---------------------------------------------------
1) 회원탈퇴시 기존의 회원 테이블의 데이터를 DELETE한 후, 곧바로 탈퇴한 회원들만 따로 보관하는 테이블에 자동으로 INSERT 할 때
2) 회원의 신고횟수가 일정 수를 넘었을 경우, 묵시적으로 해당 회원을 곧바로 블랙리스트로 처리하고자 할 때
3) 상품에 대한 입출고 데이터가 기록(INSERT, DELETE)될 때마다 해당 상품에 대한 재고수량을 매번 수정(UPDATE)해야 할 때
---------------------------------------------------------
🖊️ BEFORE TRIGGER : 내가 지정한 테이블에 이벤트가 발생되기 전
트리거 실행
🖊️ AFTER TRIGGER : 내가 지정한 테이블에 이벤트가 발생된 후
트리거 실행
🖊️ STATEMENT TRIGGER(문장트리거) : 이벤트가 발생한 SQL문에 대해 딱 한번만 트리거 수행
🖊️ ROW TRIGGER (행트리거) : 해당 SQL문이 실행될 때마다 매번 트리거 실행
⭐ FOR EACH ROW 옵션을 기술해야함 ! !
:OLD ==> BEFORE UPDATE(수정전데이터), BEFORE DELETE(삭제전 데이터)
:NEW ==> AFTER INSERT(추가된데이터), AFTER UPDATE(수정후 데이터)
📢--------------------------------------------------------
/*표현법
CREATE [OR REPLACE] TRIGGER 트리거명
BEFORE|AFTER INSERT|UPDATE|DELETE ON 테이블명
[FOR EACH ROW]
[DECLARE
변수선언;]
BEGIN
실행내용(이벤트 발생시 자동으로 실행할 구문);
[EXCEPTION
예외처리구문;]
END;
/
*/
데이터가 추가되면 '신입사원님 환영합니다!' 출력됨
1. 상품을 보관할 데이터 생성 !
2. 상품코드를 중복되지 않고 차례대로 입력하는 시퀀스 생성 !
3. 상품에 대한 입출고 상세 이력 테이블 생성
4. 상세이력 코드 중복되지 않고 차례대로 입력하는 시퀀스 생성 ! (NEXTVAL)
-- TB_PRODETAIL 테이블에 INSERT 이벤트 발생시
-- TB_PRODUCT 테이블에 매번 자동으로 재고수량 UPDATE 되게끔 트리거 정의
/*
> 상품 입고된 경우 (INSERT된 자료의 STATUS 값이 '입고'일 경우)
UPDATE TB_PRODUCT1
SET STOCK = STOCK + 현재입고된수량(INSERT된 자료의 AMOUNT 값)
WHERE PCODE = 현재 입고된 상품코드 (INSERT된 자료의 PCODE 값)
> 상품 출고된 경우 (INSERT된 자료의 STATUS 값이 '출고'일 경우)
UPDATE TB_PRODUCT1
SET STOCK = STOCK - 현재출고된수량(INSERT된 자료의 AMOUNT 값)
WHERE PCODE = 현재 출고된 상품코드 (INSERT된 자료의 PCODE 값)
*/
CREATE OR REPLACE TRIGGER TRG_02
AFTER INSERT ON TB_PRODETAIL
FOR EACH ROW
BEGIN
IF :NEW.STATUS = '입고'
THEN
UPDATE TB_PRODUCT1
SET STOCK = STOCK + :NEW.AMOUNT
WHERE PCODE = :NEW.PCODE;
END IF;
IF :NEW.STATUS = '출고'
THEN
UPDATE TB_PRODUCT1
SET STOCK = STOCK - :NEW.AMOUNT
WHERE PCODE = :NEW.PCODE;
END IF;