트리거

이태규·2022년 3월 25일
0

SQL

목록 보기
24/26

트리거란?

데이터베이스 트리거(Database Trigger)는 테이블에 대한 이벤트에 반응해 자동으로 실행되는 작업을 의미한다. 트리거는 데이터 조작 언어(DML)의 데이터 상태의 관리를 자동화하는 데 사용된다. 트리거를 사용하여 데이터 작업 제한, 작업 기록, 변경 작업 감사 등을 할 수 있다.

  • 행 트리거: 테이블 안의 영향을 받은 행 각각에 대해 실행된다. 변경 전 또는 변경 후의 행은 OLD, NEW라는 가상 줄 변수를 사용하여 읽을 수 있다.

  • 문장 트리거:INSERT, UPDATE, DELETE 문에 대해 한번만 실행된다.
    또한 트리거는 다음과 같은 속성을 갖는다.

  • BEFORE 또는 AFTER
    트리거가 실행되는 시기를 지정한다.

  • INSTEAD OF
    트리거를 원래 문장 대신 수행한다.

  • WHEN
    트리거를 시작하는 조건식을 지정한다.

--트리거 -> 특정 활동을 하는 프로시저임
SET SERVEROUT ON;

INSERT시 동작 수행 트리거 생성

TRI_MEMBER4_INSERT
CREATE OR REPLACE TRIGGER TRI_MEMBER42_INSERT
    AFTER INSERT ON MEMBER4 -- MEMBER4에 INSERT가 시행되기 전에
    FOR EACH ROW -- 행단위로 처리 됨
BEGIN
    DBMS_OUTPUT.PUT_LINE('MEMBER4에 추가됨');
    INSERT INTO MEMBER4_BK(USERID, USERPW, USERNAME, USERAGE, USERDATE)
    VALUES(:new.USERID, :new.USERPW,:new.USERNAME, :new.USERAGE, CURRENT_DATE);
END;
/

트리거의 COMMIT

--트리거는 자동으로 COMMIT이 되기 때문에 내부에서 COMMIT ROLLBACK을 쓸수없다

트리거 확인 방법

INSERT INTO MEMBER4(USERID, USERPW, USERNAME, USERAGE, USERDATE)
VALUES('BC','B','B',25,CURRENT_DATE);
SELECT * FROM MEMBER4;

테이블 구조 + 내용 복사

CREATE TABLE MEMBER4_BK AS SELECT * FROM MEMBER4;

UPDATE시 동작 수행 트리거

트리거 생성 TRI_MEMBER4_UPDATE

CREATE OR REPLACE TRIGGER TRI_MEMBER45_UPDATE
    AFTER UPDATE ON MEMBER4 -- MEMBER4에 INSERT가 시행되기 전에
    FOR EACH ROW -- 행단위로 처리 됨
BEGIN
    DBMS_OUTPUT.PUT_LINE('member2 테이블 자료변경됨');
    DBMS_OUTPUT.PUT_LINE('변경전 데이터 : ' || :old.USERNAME);
    DBMS_OUTPUT.PUT_LINE('변경할 데이터 : ' || :new.USERNAME);
    UPDATE MEMBER4_BK SET USERNAME=:new.USERNAME
    WHERE USERID=:old.USERID;
END;
/

DELETE시 동작 수행 트리거

CREATE OR REPLACE TRIGGER TRI_MEMBER4_DELETE
    AFTER DELETE ON MEMBER4 -- MEMBER4에 DELETE가 시행되기 전에
    FOR EACH ROW -- 행단위로 처리 됨
BEGIN
    DBMS_OUTPUT.PUT_LINE('member4 테이블 자료삭제됨');
    DBMS_OUTPUT.PUT_LINE('변경전 데이터 : ' || :old.USERNAME);
    DBMS_OUTPUT.PUT_LINE('변경할 데이터 : ' || :new.USERNAME);
    UPDATE MEMBER4_BK SET USERNAME=:new.USERNAME
    WHERE USERID=:old.USERID;
END;
/

트리거 비활성화

ALTER TRIGGER TRI_MEMBERTT_INSERT DISABLE;

트리거는 BACKUP데이터를 만드는 데 사용함.

ISNERT, UPDATE, DELETE 한 번에 처리하기

BEGIN
    IF INSERTING THEN
        DBMS_OUTPUT.PUT_LINE('MEMBER4에 추가됨1111');
        INSERT INTO MEMBER4_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 테이블 자료변경됨1111');
        DBMS_OUTPUT.PUT_LINE('변경전 데이터1111 : ' || :old.USERNAME);
        DBMS_OUTPUT.PUT_LINE('변경할 데이터1111 : ' || :new.USERNAME);
        UPDATE MEMBER4_BK SET USERNAME=:new.USERNAME
        WHERE USERID=:old.USERID;
    ELSIF DELETING THEN
        DBMS_OUTPUT.PUT_LINE('member4 테이블1111 자료삭제됨');
        DELETE FROM MEMBER4_BK WHERE USERID=:old.USERID;
    END IF;
END;
/

조건문으로 처리한다.

profile
한 걸음씩 나아가자

0개의 댓글