본문 바로가기
Database/oracle

Oracle - Trigger만들기

by 인기쟁이 돌고래 2021. 2. 2.

 데이터베이스 트리거 (Database Trigger)?

테이블에 대한 이벤트에 반응해 자동으로 실행되는 작업- 위키

 

 

 

 장/단점

 

어떤 테이블에 변경사항이 생길 때마다 로그(히스토리)를 남기고 싶다. 이때 Trigger을 사용하면?

장점 : 부가적인 작업인 로그적재를 Trigger에서 해주어 소스상에서는 메인작업만 신경쓰면 된다. (소스깔끔)

단점 : 소스에서 안보이다보니 (의도한건 아니지만 숨겨져 있어서)  trigger가 존재하는걸 모른다면 갑자기생긴 log데이터에 당황스러울 수 있다.

=> 잘만 사용하면 소스도 깔끔해지고 편리할 수 있지만,  어쨌든 추가작업이다보니 생길 DB성능의 문제와 갑툭튀한 데이터에 당황스러울 수있으니 남발하지 말자.

 

 

 Template 

{OWNER}.{TRIGGER_SOURCE_TABLENAME} 에 insert, delete, update가 있을 경우
{OWNER}.{TRIGGER_NAME} 트리거가 실행된다.

:OLD기존에 있던 데이터를, :NEW 는 새로 들어온 데이터를 의미한다.

Operation별(inserting, updating, deleting) 로 action을 따로 지정해줘야 한다.

 

CREATE TRIGGER {OWNER}.{TRIGGER_NAME} 
  AFTER INSERT OR DELETE OR UPDATE  ON {OWNER}.{TRIGGER_SOURCE_TABLENAME}
FOR EACH ROW
DECLARE
  V_LOG_TYPE VARCHAR2(1) := 'N';
BEGIN
	-- insert DML이 발생하면 
    IF INSERTING THEN
        V_LOG_TYPE := 'I';
        INSERT INTO  {TRIGGER_TABLENAME}
          (
                LOG_DATE,
                LOG_TYPE,
                AGE
                )
        VALUES
         (
            SYSDATE             ,
            V_LOG_TYPE          ,
            :NEW.AGE
          ) ;
    -- update DML이 발생하면 
    ELSIF UPDATING THEN
        V_LOG_TYPE := 'U';
        INSERT INTO  {TRIGGER_TABLENAME}
          (
                LOG_DATE,
                LOG_TYPE,
                AGE
           )
        VALUES
         (
            SYSDATE             ,
            V_LOG_TYPE          ,
            :OLD.AGE
          ) ;
    -- delete DML이 발생하면 
    ELSIF DELETING THEN
        V_LOG_TYPE := 'D';
        INSERT INTO  {TRIGGER_TABLENAME}
          (
                LOG_DATE,
                LOG_TYPE,
                AGE
           )
        VALUES
         (
            SYSDATE             ,
            V_LOG_TYPE          ,
            :OLD.AGE
          ) ;
    END IF;
    
EXCEPTION
    WHEN OTHERS THEN
        RETURN;
END ;

 

 

 

 (참고) 위에 예제 케이스 구조 

{OWNER}.{TRIGGER_SOURCE_TABLENAME}에 age이라는 컬럼이 존재,

{TRIGGER_TABLENAME}에 LOG_DATE(로그쌓인시간), LOG_TYPE(operation종류), age(데이터) 컬럼이 존재하며,

TRIGGER_SOURCE_TABLENAME}에 data수정이 있을 때마다 {TRIGGER_TABLENAME}에 이력을 쌓는다.

 

댓글