데이터베이스 트리거(Database Trigger)는 테이블에 대한 이벤트에 반응해 자동으로 실행되는 작업을 의미한다. 트리거는 데이터 조작 언어(DML)의 데이터 상태의 관리를 자동화하는 데 사용된다. 트리거를 사용하여 데이터 작업 제한, 작업 기록, 변경 작업 감사 등을 할 수 있다.
행 트리거: 테이블 안의 영향을 받은 행 각각에 대해 실행된다. 변경 전 또는 변경 후의 행은 OLD, NEW라는 가상 줄 변수를 사용하여 읽을 수 있다.
문장 트리거:INSERT, UPDATE, DELETE 문에 대해 한번만 실행된다.
또한 트리거는 다음과 같은 속성을 갖는다.
BEFORE 또는 AFTER
트리거가 실행되는 시기를 지정한다.
INSTEAD OF
트리거를 원래 문장 대신 수행한다.
WHEN
트리거를 시작하는 조건식을 지정한다.
--트리거 -> 특정 활동을 하는 프로시저임
SET SERVEROUT ON;
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 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;
트리거 생성 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;
/
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데이터를 만드는 데 사용함.
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;
/
조건문으로 처리한다.