트리거 : 자동으로 실행되는 프로시져
SET SERVEROUT ON;
MEMBER2 트리거
트리거 생성 TRI_MEMBER2_INSERT
CREATE OR REPLACE TRIGGER TRI_MEMBER2_INSERT
AFTER INSERT ON MEMBER2
FOR EACH ROW
BEGIN
DBMS_OUTPUT.PUT_LINE('MEMBER2 테이블에 자료추가됨');
INSERT INTO MEMBER2_BK (USERID, USERPW, USERNAME, USERAGE, USERDATE)
VALUES(:NEW.USERID, :NEW.USERPW, :NEW.USERNAME, :NEW.USERAGE, CURRENT_DATE);-- 자동커밋
END;
/
-- 트리거 확인
INSERT INTO MEMBER2 (USERID, USERPW, USERNAME, USERAGE, USERDATE)
VALUES('G','G','G',60,CURRENT_DATE);
COMMIT;
SELECT * FROM MEMBER2;
테이블 생성 테이블 구조 + 내용 복사
CREATE TABLE MEMBER2_BK AS SELECT * FROM MEMBER2;
SELECT * FROM MEMBER2;
SELECT * FROM MEMBER2_BK;
트리거 생성 TRI_MEMBER2_UPDATE
CREATE OR REPLACE TRIGGER TRI_MEMBER2_UPDATE
AFTER UPDATE ON MEMBER2
FOR EACH ROW
BEGIN
DBMS_OUTPUT.PUT_LINE('MEMBER2 테이블에 자료변경됨');
DBMS_OUTPUT.PUT_LINE('변경전 데이터 : '|| :OLD.USERNAME);
DBMS_OUTPUT.PUT_LINE('변경한 데이터 : '|| :NEW.USERNAME);
UPDATE MEMBER2_BK SET USERNAME= :NEW.USERNAME
WHERE USERID = :OLD.USERID;
END;
/
-- 트리거 확인
UPDATE MEMBER2 SET USERNAME='G변경이름' WHERE USERID = 'G';
COMMIT;
트리거 생성 TRI_MEMBER2_DELETE
CREATE OR REPLACE TRIGGER TRI_MEMBER2_DELETE
AFTER DELETE ON MEMBER2
FOR EACH ROW
BEGIN
DBMS_OUTPUT.PUT_LINE('MEMBER2 테이블에 자료삭제됨');
DBMS_OUTPUT.PUT_LINE('MEMBER2 테이블에서 ' || :OLD.USERID ||'가 삭제됨');
DELETE FROM MEMBER2_BK WHERE USERID = :OLD.USERID;
END;
/
DELETE FROM MEMBER2 WHERE USERID = 'E';
COMMIT;
트리거 활성화, 비활성화 (ENABLE DISABLE)
ALTER TRIGGER TRI_MEMBER2_DELETE DISABLE;
트리거 생성 TRI_MEMBER2_IUD(추가, 수정, 삭제)
CREATE OR REPLACE TRIGGER TRI_MEMBER2_IUD
AFTER INSERT OR UPDATE OR DELETE ON MEMBER2
FOR EACH ROW
BEGIN
IF INSERTING THEN
DBMS_OUTPUT.PUT_LINE('MEMBER2 테이블에 자료추가됨');
INSERT INTO MEMBER2_BK (USERID, USERPW, USERNAME, USERAGE, USERDATE)
VALUES(:NEW.USERID, :NEW.USERPW, :NEW.USERNAME, :NEW.USERAGE, CURRENT_DATE);
ELSIF UPDATING THEN
DBMS_OUTPUT.PUT_LINE('MEMBER2 테이블에 자료변경됨');
DBMS_OUTPUT.PUT_LINE('변경전 데이터 : '|| :OLD.USERNAME);
DBMS_OUTPUT.PUT_LINE('변경한 데이터 : '|| :NEW.USERNAME);
UPDATE MEMBER2_BK SET USERNAME= :NEW.USERNAME
WHERE USERID = :OLD.USERID;
ELSIF DELETING THEN
DBMS_OUTPUT.PUT_LINE('MEMBER2 테이블에 자료삭제됨');
DBMS_OUTPUT.PUT_LINE('MEMBER2 테이블에서 ' || :OLD.USERID ||'가 삭제됨');
DELETE FROM MEMBER2_BK WHERE USERID = :OLD.USERID;
END IF;
END;
/
트리거 생성 TRI_MEMBER2_UPDATE_AGE
CREATE OR REPLACE TRIGGER TRI_MEMBER2_UPDATE_AGE
AFTER UPDATE OF USERAGE ON MEMBER2
FOR EACH ROW
BEGIN
DBMS_OUTPUT.PUT_LINE('MEMBER2 테이블에 자료변경됨');
DBMS_OUTPUT.PUT_LINE('변경전 데이터 : '|| :OLD.USERNAME);
DBMS_OUTPUT.PUT_LINE('변경한 데이터 : '|| :NEW.USERNAME);
UPDATE MEMBER2_BK SET USERNAME= :NEW.USERNAME
WHERE USERID = :OLD.USERID;
END;
/
SELECT * FROM ORDER2;
ORDER2 트리거
트리거 생성 TRI_ORDER2_INSERT
-- 주문 했을 때 주문수량만큼 물품테이블의 재고수량 변경
CREATE OR REPLACE TRIGGER TRI_ORDER2_INSERT
AFTER INSERT ON ORDER2
FOR EACH ROW
DECLARE
V_QTY NUMBER :=0;
BEGIN
-- 물품테이블에서 제고수량을 가져옴.
SELECT I.ITEMQTY INTO V_QTY FROM ITEM2 I WHERE I.ITEMNO =:NEW.ITEMNO;
-- 주문수량이 재고수량보다 작거나 같아야함.
IF :NEW.ORDCNT <= V_QTY THEN
-- 물품의 재고수량에서 주문수량만큼 뺌
UPDATE ITEM2 SET ITEMQTY = ITEMQTY-:NEW.ORDCNT WHERE ITEMNO =:NEW.ITEMNO;
ELSE
-- 오류 출력
RAISE_APPLICATION_ERROR(-20022,'재고부족');
END IF;
END;
/
INSERT INTO ORDER2 (ORDNO, ORDCNT, ORDDATE, ITEMNO, USERID)
VALUES(SEQ_ORDER2_ORDNO.NEXTVAL, 100, CURRENT_DATE, 1012, 'A');
COMMIT;
트리거 생성 TRI_ORDER_IUD
-- 주문이 추가되면 주문백업 테이블에 자료 백업
-- 주문 백업 테이블 생성
CREATE TABLE ORDER2_BK AS SELECT * FROM ORDER2;
-- 추가,수정,삭제
CREATE OR REPLACE TRIGGER TRI_ORDER2_IUD
AFTER INSERT OR UPDATE OR DELETE ON ORDER2
FOR EACH ROW
BEGIN
-- 추가시는 재고수량 감소
IF INSERTING THEN
-- 물품의 재고수량에서 주문수량만큼 뺌
UPDATE ITEM2 SET ITEMQTY = ITEMQTY - :NEW.ORDCNT WHERE ITEMNO = :NEW.ITEMNO;
INSERT INTO ORDER2_BK (ORDNO, ORDCNT, ORDDATE, ITEMNO, USERID)
VALUES(:NEW.ORDNO, :NEW.ORDCNT, CURRENT_DATE, :NEW.ITEMNO, :NEW.USERID);
-- 수정때는 재고수량을 감소, 증가
ELSIF UPDATING THEN
UPDATE ITEM2 SET ITEMQTY = ITEMQTY + (:OLD.ORDCNT - :NEW.ORDCNT)
WHERE ITEMNO = :NEW.ITEMNO;
UPDATE ORDER2_BK SET ORDCNT= :NEW.ORDCNT WHERE ORDNO = :OLD.ORDNO;
-- 삭제시는 재고수량 증가
ELSIF DELETING THEN
UPDATE ITEM2 SET ITEMQTY = ITEMQTY + :OLD.ORDCNT WHERE ITEMNO = :OLD.ITEMNO;
DELETE FROM ORDER2_BK WHERE ORDNO = :OLD.ORDNO;
END IF;
END;
/
-- 트리거 확인
INSERT INTO ORDER2 (ORDNO, ORDCNT, ORDDATE, ITEMNO, USERID)
VALUES(SEQ_ORDER2_ORDNO.NEXTVAL, 100, CURRENT_DATE, 1012, 'B');
UPDATE ORDER2 SET ORDCNT=50 WHERE ORDNO=10007;
DELETE FROM ORDER2 WHERE ORDNO = 10007;
COMMIT;