[34일 차] : Oracle - TRIGGER

서하루·2022년 11월 29일
0

(2) Oracle 공부기록

목록 보기
11/11

[학습목표]

  • TRIGGER


TRIGGER란?

💡 내가 지정한 특정 테이블에 INSERT, UPDATE, DELETE 등의 DML문에 의해 변경사항이 생길 때 매번 자동으로 실행시킬 내용을 미리 정의해둘 수 있는 객체이다.

📢 ---------------------------------------------------
1) 회원탈퇴시 기존의 회원 테이블의 데이터를 DELETE한 후, 곧바로 탈퇴한 회원들만 따로 보관하는 테이블에 자동으로 INSERT 할 때

2) 회원의 신고횟수가 일정 수를 넘었을 경우, 묵시적으로 해당 회원을 곧바로 블랙리스트로 처리하고자 할 때

3) 상품에 대한 입출고 데이터가 기록(INSERT, DELETE)될 때마다 해당 상품에 대한 재고수량을 매번 수정(UPDATE)해야 할 때

---------------------------------------------------------

TRIGGER의 종류

✅ SQL문의 실행시기에 따른 분류

🖊️ BEFORE TRIGGER : 내가 지정한 테이블에 이벤트가 발생되기 전 트리거 실행
🖊️ AFTER TRIGGER : 내가 지정한 테이블에 이벤트가 발생된 후 트리거 실행

✅ SQL문에 의해 영향을 받는 각 행에 따른 분류

🖊️ 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) 반복적으로 실행되는 트리거 생성하고 적용하기

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;
    

0개의 댓글