TRIGGER

EUNJI LEE·2023년 4월 14일
0

SQL

목록 보기
12/14

TRIGGER

TABLE 혹은 VIEW가 수정될 때 자동으로 실행될 내용을 정의하여 저장해두는 객체를 말한다. TRIGGER를 이용하면 자바에서 처리할 로직을 줄일 수 있지만 실행에 문제가 생기는 경우 DB 로그를 확인해야 한다는 문제점이 있다.

TRIGGER도 객체이기 때문에 CREATE를 써서 생성해서 사용한다. CREATE TRIGGER 트리거명 실행DML구문 ON 테이블명 BEGIN~END;/로 작성하면 해당 테이블의 DEL 구문이 실행될 때마다 트리거가 함께 실행된다. TRIGGER는 자동 COMMIT하기 때문에 안에 COMMIT 작성은 안 한다.

TIRGGER 활용

INSERT는 새로운 값이 있고 이전 값이 없기 때문에 새로운 값을 불러내는 NEW.컬럼명;을 사용한다.

UPDATE는 이전 값, 새로운 값이 전부 존재하기 때문에 NEW.컬럼명;과 이전 값을 불러내는 OLD.컬럼명;을 사용한다.

DELETE는 새로운 값은 없지만 이전 값이 존재하고 데이터를 되돌리거나 삭제 기록을 남기기 위해서 이전 값을 사용하기 위해 OLD.컬럼명;을 사용할 수 있다.

--EMPLOYEE 테이블에 INSERT가 실행될 때마다 실행되는 TRIGGER
CREATE OR REPLACE TRIGGER TRG_01
AFTER INSERT ON EMPLOYEE
FOR EACH ROW
BEGIN
    DBMS_OUTPUT.PUT_LINE('신입사원 '||:NEW.EMP_NAME||'님이 입사하였습니다.');
END;
/

--INSERT구문에 따라 제품 재고 관리
CREATE TABLE TBL_PRODUCT(
    PCODE NUMBER PRIMARY KEY,
    PNAME VARCHAR2(20) NOT NULL,
    BRAND VARCHAR2(20),
    PRICE NUMBER CHECK(PRICE>0),
    STOCK NUMBER DEFAULT 0
);

CREATE SEQUENCE SEQ_PRO;

CREATE TABLE TBL_PROIO(
    IOCODE NUMBER PRIMARY KEY,
    PCODE NUMBER REFERENCES TBL_PRODUCT(PCODE),
    IODATE DATE,
    AMOUNT NUMBER CHECK(AMOUNT>0),
    STATUS VARCHAR2(10) CHECK(STATUS IN('입고','출고'))
);

CREATE SEQUENCE SEQ_PROIO;

CREATE TRIGGER TRG_PRODUCT
AFTER INSERT ON TBL_PROIO
FOR EACH ROW
BEGIN
    IF :NEW.STATUS='입고'
        THEN UPDATE TBL_PRODUCT SET STOCK=STOCK+:NEW.AMOUNT WHERE :NEW.PCODE=PCODE;
    ELSIF : NEW.STATUS='출고'
        THEN UPDATE TBL_PRODUCT SET STOCK=STOCK-:NEW.AMOUNT WHERE :NEW.PCODE=PCODE;
    END IF;
END;
/
profile
천천히 기록해보는 비비로그

0개의 댓글