SQL활용 2022/03/25(SQL 작성하기) 트리거

무간·2022년 3월 25일

트리거 : 자동으로 실행되는 프로시져

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;
profile
당신을 한 줄로 소개해보세요

0개의 댓글