Published 2022. 11. 29. 16:44

  < 트리거 TRIGGER >


   내가 지정한 테이블에 INSERT,UPDATE,DELETE등의 DML문에 의해 변경사항이 생길때(즉, 테이블에 이벤트 발생했을때)  매번 "자동으로 실행시킬 내용"을 미리 정의해둘 수 있는 객체 
    
    EX)
   - 회원 탈퇴시 기존의 회원테이블에 데이터 DELETE 후 곧바로 탈퇴한 회원들만 따로 보관하는 테이블에 
    자동으로 INSERT처리해야할때 
   - 회원의 신고횟수가 일정 수를 넘었을 경우 묵시적으로 해당 해원을 블랙리스트로 처리 되게끔할때 
   - 입출고에 대한 데이터가 기록(INSERT)될 때마다 해당 상품에 대한 재고수량을 매번 수정(UPDATE)해야될때
    
  

  * 트리거 종류 

    - 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
        실행내용(위에 지정된 이벤트 발생시 묵시적으로 (자동으로) 실행시킬 구문 
     EXCEPITON 
        예외처리 구문;
     END;
     /

 

예시) EMPLOYEE테이블에 새로운행이 INSERT될때마다 자동으로 메시지 출력시켜주는 트리거 정의

CREATE OR REPLACE TRIGGER TRG_01
AFTER INSERT ON EMPLOYEE
BEGIN
    DBMS_OUTPUT.PUT_LINE('신입사원님 환영합니다!');
END;
/


   예시) 상품 입고 및 출고 관련 예시 

--1. 상품에 대한 데이터 보관할 테이블 (TB_PRODUCT2)
DROP TABLE TB_PRODUCT;
CREATE TABLE TB_PRODUCT2(
    PCODE VARCHAR2(8) PRIMARY KEY,
    PNAME VARCHAR2(30) NOT NULL,
    BRAND VARCHAR2(30) NOT NULL,
    PRICE NUMBER,
    STOCK NUMBER DEFAULT 0
);
--상품 코드용 시퀀스 (SEQ_PCODE)
CREATE SEQUENCE SEQ_PCODE
NOCACHE;

--샘플데이터 3개 추가 
INSERT INTO TB_PRODUCT2 VALUES('PRO_'||LPAD(SEQ_PCODE.NEXTVAL,3,'0'),'갤럭시플립','삼성',1400000,DEFAULT);
INSERT INTO TB_PRODUCT2 VALUES('PRO_'||LPAD(SEQ_PCODE.NEXTVAL,3,'0'),'아이폰14PRO','애플',1500000,10);
INSERT INTO TB_PRODUCT2 VALUES('PRO_'||LPAD(SEQ_PCODE.NEXTVAL,3,'0'),'대륙폰','샤오미',700000,20);

--2. 상품 입출고 상세이력 테이블 (TB_PRODETAIL)
--어떤 상품이 어떤날짜에 몇개가 입고 또는 출고가 되었는지에 대한 데이터를 기록하는 테이블 
CREATE TABLE TB_PRODETAIL(
    DCODE NUMBER PRIMARY KEY,
    PCODE VARCHAR2(8) REFERENCES TB_PRODUCT2,
    PDATE DATE NOT NULL,
    AMOUNT NUMBER NOT NULL,
    STATUS CHAR(6) CHECK(STATUS IN ('입고','출고'))
);

--이력 번호용 시퀀스 
CREATE SEQUENCE SEQ_DCODE
NOCACHE;

>> TB_PRODETAIL 테이블에서 INSERT이벤트 발생시 TB_PRODUCT2 테이블에 매번 자동으로
  재고수량 UPDATE 되게끔 트리거 정의 

CREATE OR REPLACE TRIGGER TRG_02
AFTER INSERT ON TB_PODETAIL
FOR EACH ROW
BEGIN 
	IF :NEW.STATUS = '입고'
      THEN
        UPDATE TB_PRODUCT2
           SET STOCK = STOCK + :NEW.AMOUNT
         WHERE PCODE = :NEW.PCODE;
    END IF;    
    IF :NEW.STAUE = '출고'
       THEN
         UPDATE TB_PRODUCT2
            SET STOCK = STOCK - :NEW.AMOUNT
          WHERE PCODE = :NEW.PCODE;
    END IF;      
END;
/

 

'ORACLE' 카테고리의 다른 글

ORACLE 13. PLSQL _예외처리  (0) 2022.11.25
ORACLE 13. PLSQL _반복문  (0) 2022.11.25
ORACLE 13. PLSQL _조건문  (0) 2022.11.25
ORACLE 12. OBJECT (SEQUENCE)  (0) 2022.11.25
ORACLE 11. OBJECT (VIEW) _ VIEW 옵션  (0) 2022.11.24
복사했습니다!