본문 바로가기
IT 자료

DB2 TRIGGER (자료 백업하기)

by 성곤 2014. 11. 22.
반응형

 

학원에서 배울 때는 오라클 기준으로만 배웠었는데...

프로젝트에서는 DB2를 쓴다.

 

그냥 비슷하겠지... 똑같겠지... 하는 생각이였는데

거의 비슷하고, 거의 똑같다.

 

새로운 개발을 하는데, 해당 테이블의 자료가 중요해서

PM님이 수정이나 업데이트 되면 따로 백업 테이블에 원본을 넣으라고 했다.

 

트리거를 사용하라고 했는데,

"트리거요? (@,.@)?" 이런 표정으로 쳐다보니...

우리 대리님이 옆에서 도와줄테니까, 일단 개발 다 한 다음에 트리거해도 되니까 걱정하지 말란다.

 

일단 개발을 끝내고 트리거를 만들려고 구글을 뒤적거려도 생각보다 쉽지는 않았다.

(이래서 멍청하면 고생이다.)

 

 

--- 예문 시작 ---

 

CREATE TRIGGER TRIGGER_NM

/* 트리거 이름(TRIGGER_NM) 만들기 */


AFTER INSERT OR UPDATE OR DELETE  ON TABLE_NM

/* 기존테이블(TABLE_NM) insert, update, delete가 발생한 후에 */


REFERENCING NEW AS N OLD AS O

/* 새로운 값 NEW는 N, 과거의 값 OLD는 O 라고 선언 */


FOR EACH ROW MODE DB2SQL

/* 오라클에서는 MODE DB2SQL이라는 문구가 없다...

DB2에서는 꼭 'MODE DB2SQL' 이라고 해줘야한다. 저것 때문에 진짜 개빡쳤고 외국서적까지 찾아봤다. */

 


BEGIN

  IF INSERTING /* 기존테이블(TABLE_NM) 에 INSERT가 일어났을 때*/
  THEN
    INSERT INTO TABLE_BAK
                VALUES ( SYSDATE, 'INSERT', N.COLUMN );

 

/* 백업테이블(TABLE_BAK)에 컬럼 '현재시간', 'INSERT', 'NEW.COLUMN값'을 넣는다.

이렇게 만들어주면, 원본 테이블에 INSERT가 일어나면, 백업테이블에도 똑같은 같이 INSERT된다. */

 

 END IF;

 

 


  IF UPDATING
  THEN
    INSERT INTO ​TABLE_BAK
                VALUES ( SYSDATE, 'UPDATE', N.COLUMN );

 

/* UPDATE도 마찬가지다, UPDATE를 하면 업데이트된 새로운 값이 백업테이블로 넘어가는데...

이때 좀 생각해봐야할 것이 있다.

UPDATE를 해서 새로운 값을 백업에 넣을꺼냐, UPDATE되기 전의 값을 백업에 넣을꺼냐이다.

 

나같은 경우는 INSERT 트리거부분에서 어차피 최초의 값이 백업되어서 있기 때문에 UPDATE 트리거부분은 NEW값을 백업테이블에 넣었다. */



 END IF;


  IF DELETING
  THEN
    INSERT INTO ​TABLE_BAK
                VALUES ( SYSDATE, 'DELETE' ,O.COLUMN );

 


/* DELETE된 후에 OLD값을 백업테이블에 넣는다.

 

DELETE에서는 NEW를 쓸 수 없다. 삭제만 하기 때문에 오직 OLD값만 쓸 수 있다.

UPDATE는 OLD와 NEW를 다 쓸 수 있다. 값이 변하기 때문이다.*/


  END IF;

END 

 

 

 

--- 예문 종료 ---

 

 

 

 

 

난 이렇게 만들었고, PM님과 대리님께 확인을 받았다.

 

돌아오는 답변은

"잘했어요, 특별한 문제는 없네요. 하지만, INSERT는 빼버리고 UPDATE는 NEW가 아닌 OLD를 사용하는게 좋겠네요."

 

일단, INSERT를 하면 그 값이 UPDATE나 DELETE가 발생하기 전까지는 원본테이블에 그대로 보존되어있기 때문에 굳이 백업테이블까지 INSERT할 필요는 없고

 

UPDATE가 일어나면 UPDATE되기 전의 OLD값이 백업테이블로 넘어가면 된다는거다.

 

 

 

 

 

반응형

'IT 자료' 카테고리의 다른 글

c:if  (0) 2014.11.25
SQLSTATE=0168D 에러  (0) 2014.11.24
JavaScript random()  (0) 2014.11.24
DB2 ROWNUM  (0) 2014.11.23
DB2 SQL0696N 에러  (0) 2014.11.22