[Oracle] 40.트리거


트리거



트리거라는 단어의 의미는 총의 방아쇠라는 뜻입니다!

오라클에서의 트리거는 역시 해당 단어의 의미처럼 어떤 이벤트가 발생하면 자동적으로 방아쇠가 당겨져 총알이 발사되듯이

특정 테이블이 변경되면 이를 이벤트로 다른 테이블이 자동으로 변경되도록 하기 위해서 사용합니다.

트리거의 구조는 다음과 같습니다!


CREATE TRIGGER trigger_name 
timing[BEFORE|AFTER] event[INSERT|UPDATE|DELETE]
ON table_name
[FOR EACH ROW]
[WHEN conditions]
BEGIN 
statement
END





트리거의 유형은 FOR EACH ROW에 의해 문장 레벨 트리거와 행 레벨 트리거로 나뉩니다.

FOR EACH ROW가 생략되면 문장 레벨 트리거이고 행 레벨 트리거를 정의하고자 할 때에는 반드시 FOR EACH ROW를 기술해야만 합니다.

문장 레벨 트리거는 어떤 사용자가 트리거가 설정되어 있는 테이블에 대해 DML(INSERT, UPDATE, DELETE)문을 실행할 때 단 한번만 트리거를 발생시킬 때 사용합니다.

행 레벨 트리거는 DML(INSERT, UPDATE, DELETE)문에 의해서 여러 개의 행이 변경된다면 각 행이 변경될 때마다 트리거를 발생시키는 방법입니다. 만약 5개의 행이 변경되면 트리거가 5번 발생됩니다.



트리거 생성과 실행




트리거 실습을 위해 다음과 같이 상품테이블과 입고테이블을 정의하겠습니다!


CREATE TABLE 상품(
    상품코드 CHAR(6 BYTE) PRIMARY KEY,
    상품명 VARCHAR2(12 BYTE),
    제조사 VARCHAR2(12 BYTE),
    소비자가격 NUMBER(8),
    재고수량 NUMBER
);

CREATE TABLE 입고(
    입고번호 NUMBER(6) PRIMARY KEY,
    상품코드 CHAR(6 BYTE) REFERENCES 상품(상품코드),
    입고일자 DATE,
    입고수량 NUMBER(6),
    입고단가 NUMBER(8),
    입고금액 NUMBER(8)
);



INSERT INTO 상품 VALUES('D00001','SMART TV','LG',1100000,1);
INSERT INTO 상품 VALUES('D00002','스피커','LG',590000,5);
INSERT INTO 상품 VALUES('D00003','전기밥솥','쿠쿠',380000,10);




image




  • 입고테이블에 데이터가 추가된 후에, 상품테이블의 해당 행의 재고 수량이 입고된 수량 만큼 증가




-- 트리거 생성 --

CREATE OR REPLACE TRIGGER TRI_입고_ins_aft
AFTER INSERT
ON 입고
FOR EACH ROW
BEGIN
UPDATE 상품
SET 재고수량=재고수량+:new.입고수량
WHERE 상품.상품코드=:new.상품코드;
END;
/




INSERT INTO 입고 VALUES(1,'D00001','2018/08/05',5,null,null);




image




결과를 보면 입고테이블에 데이터가 추가되었고, 그와 동시에 상품테이블의 상품코드가 D0001인 SMART TV의 재고수량도 자동으로 추가된 것을 볼 수 있습니다!

이것이 바로 트리거의 역할입니다!



  • 입고 테이블의 데이터가 삭제되기 전에 상품테이블의 재고수량도 자동으로 변경




-- 트리거 생성

CREATE OR REPLACE TRIGGER TRI_입고_del_bef
BEFORE DELETE
ON 입고
FOR EACH ROW
BEGIN
UPDATE 상품
SET 재고수량=재고수량-:old.입고수량
WHERE 상품.상품코드=:old.상품코드;
END;
/




DELETE FROM 입고 WHERE 입고번호=1;




image