PL/SQL 6: 트리거 예제

PL/SQL 6: 트리거 예제

–트리거(TRIGGER)
PL/SQL 문법을 사용.

1) 데이터베이스에서 미리 정해놓은 조건을 만족하면
   자동으로 수행되는 이벤트
2) 사용하는 SQL (INSERT, UPDATE, DELTE)
   예)  입고 => 재고 변경
        출고 => 재고 변경

3) BEFORE (PRIMARY KEY), AFTER
4) 형식
    CREATE [OR REPLACE] TRIGGER tri_name
    BEFORE|AFTER (INSERT,UPDATE,DELETE) ON 테이블명
    FOR EACH ROW
    BEGIN
      처리 문장
    END;
    /

5) 삭제
   DROP TRIGGER tri_name

6) 수정
   ALTER TRIGGER tri_name

7) 권한 부여 (conn system/tiger)
   GRANT CREATE TRIGGER TO scott
   GRANT ALTER ANY TRIGGER TO scott
   GRANT DROP ANY TRIGGER TO scott

8) 원래 값은 올드, 새값을 포함하면 NEW
:OLD.컬럼명
:NEW.컬럼명

CREATE [OR REPLACE] TRIGGER trigger_name
timing
   event1 [OR event2 OR event3…]
ON {table_name|view_name|SCHEMA|DATABASE}
[REFFERENCING OLD AD old | NEW as new]
[FOR EACH ROW [WHEN (condition) ] ]
  trigger_body

timing: BEFORE, AFTER, INSTEAD OF(트리거가 특정 뷰에 대한 DML일 경우)

CREATE TABLE 상품(품번 NUMBER,항목 VARCHAR2(20),단가 NUMBER);
CREATE TABLE 입고(품번 NUMBER,수량 NUMBER,금액 NUMBER);
CREATE TABLE 판매(품번 NUMBER,수량 NUMBER,금액 NUMBER);
CREATE TABLE 재고(품번 NUMBER,수량 NUMBER,금액 NUMBER);

INSERT INTO 상품 VALUES(100,’새우깡’,900);
INSERT INTO 상품 VALUES(200,’감자깡’,900);
INSERT INTO 상품 VALUES(300,’맛동산’,1000);

INSERT INTO 입고 VALUES(100,10,9000);
INSERT INTO 입고 VALUES(200,10,9000);
INSERT INTO 입고 VALUES(300,10,10000);

INSERT INTO 재고 VALUES(100,10,9000);
INSERT INTO 재고 VALUES(200,10,9000);
INSERT INTO 재고 VALUES(300,10,10000);

COMMIT;

—————————————————————————–

–새우깡이 입고되었을 때
CREATE OR REPLACE TRIGGER j_trigger
AFTER INSERT ON 입고
FOR EACH ROW
BEGIN
  UPDATE 재고 SET
  수량=수량+:NEW.수량,
  금액=금액+:NEW.금액
  WHERE 품번=:NEW.품번;
END;
/

INSERT INTO 입고 VALUES(100,5,4500);
SELECT * FROM 재고;

————————————————————————————

–감자깡이 5개 출고되었을 때

CREATE OR REPLACE TRIGGER p_trigger
AFTER INSERT ON 판매
FOR EACH ROW
BEGIN
  UPDATE 재고 SET
  수량=수량-:NEW.수량,
  금액=금액-:NEW.금액
  WHERE 품번=:NEW.품번; 
END;
/

INSERT INTO 판매 VALUES(200,5,4500);
SELECT * FROM 재고;