TABLE 혹은 VIEW가 수정될 때 자동으로 실행될 내용을 정의하여 저장해두는 객체를 말한다. TRIGGER를 이용하면 자바에서 처리할 로직을 줄일 수 있지만 실행에 문제가 생기는 경우 DB 로그를 확인해야 한다는 문제점이 있다.
TRIGGER도 객체이기 때문에 CREATE를 써서 생성해서 사용한다. CREATE TRIGGER 트리거명 실행DML구문 ON 테이블명 BEGIN~END;/
로 작성하면 해당 테이블의 DEL 구문이 실행될 때마다 트리거가 함께 실행된다. TRIGGER는 자동 COMMIT하기 때문에 안에 COMMIT 작성은 안 한다.
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;
/