SQLを使用して2022/03/25をトリガーします(SQLの作成)

5690 ワード

トリガー:自動実行プロセス

SET SERVEROUT ON;

MEMBER 2トリガ


トリガTRI MEMBER 2 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 MEMBER 2 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 MEMBER 2 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 MEMBER 2 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 MEMBER 2 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;

ORDER 2トリガ


トリガTRI ORDER 2 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;