CLASS

TRIGGER 사용방법

일반태그: Application Architecture.DB태그: Oracle. 1 Comment 2015년 2월 5일 968 (1)

TRIGGER에 대해서 알아 보도록 하겠습니다.

 1. 정의

* STANDARD TABLE에서 DML작업이 일어 날 경우, BACKUP TABLE에 묵시적으로 실행되는 프로시져로써 
   두 테이블 간에 데이터를 동기화 시키기 위한 목적이 있습니다.
* TRIGGER는 TABLE에 대해서만 정의가 가능하며, VIEW는 사용이 불가합니다.
* 별도의 호출명령어는 필요 없으며
   TRIGGER를 생성하기만 하면 일련의 행위가 일어났을 때, 실행 되는 방식입니다.

1-1. 트리거 종류

* 행트리거
  - 컬럼의 각각의 행의 데이터 행 변화가 생길때 마다 실행되며, 그 데이터 행의 실제값을 제어 할 수 있습니다.
* 문장트리거
  - 트리거 사건에 의해 단 한번 실행되며, 컬럼의 각 데이터 행을 제어 할 수 없습니다.


2. TRIGGER 생성 문구


3. 트리거 삭제, 활성화, 비활성화

* 삭제: DROP TRIGGER [트리거명];
* 활성화: ALTER TRIGGER [트리거명] ENABLE;
* 비활성화: ALTER TRIGGER [트리거명] DISABLE;
* 조회: SELECT * FROM DBA_OBJECTS WHERE OJBECT_TYPE = ‘TRIGGER’;
           SELECT * FROM USER_TRIGGERS;


4-1. 테스트 시나리오_1

: STANDARD TABLE과 BACKUP TABLE간의 데이터들을 실시간으로 동기화 시키고 싶을 때.

 1). TEST TABLE & DATA 생성

2). TRIGGER 생성

3). 데이터 삽입 후 ROLLBACK / COMMIT일 경우 데이터가 어떻게 들어 가는지 확인!!

4). 테스트 결과

: ST_TABLE에서 Insert 후 Commit을 했을 경우 완전히 완료가 되지만
  Rollback을 했을 경우에는 똑같이 BU_TABLE도 Rollback이 되는 것을 확인 할 수 있습니다.


4-2. 테스트 시나리오_2

: STANDARD TABLE을 참조하고 있는 프로그램이 300개가 있습니다.
  STANDARD TABLE을 참조하고 있는 프로그램을 BACKUP TABLE로 나누어서 관리를 하고 합니다.
  즉, STANDARD TABLE을 참조하는 프로그램은 200개, BACKUP TABLE을 참조하는 프로그램은 100개..
  이런 형태로 나누고 싶을 때..(두 테이블간의 데이터는 동기화)

1). TEST TABLE & DATA 생성

 ================================================================
– Test Case
– Case1) TRIGGER안에 COMMIT이 없을 경우
– Case2) TRIGGER안에 COMMIT이 있을 경우
– Case3) TRIGGER안에 PRAGMA AUTONOMOUS_TRANSACTION 선언 한 경우
================================================================

Case1) TRIGGER안에 COMMIT이 없을 경우

2-1).  TRIGGER생성

 3). 데이터 삽입 후 ROLLBACK / COMMIT일 경우 데이터가 어떻게 들어 가는지 확인!!

 4). 테스트 결과

: 데이터는 정상적으로 Insert는 되지만 ORA-04091 에러가 발생이 됩니다.

Case2) TRIGGER안에 COMMIT이 있을 경우

2-2).  TRIGGER생성

 3). 데이터 삽입 후 ROLLBACK / COMMIT일 경우 데이터가 어떻게 들어 가는지 확인!!

 4). 테스트 결과

: TRIGGER안에 Commit을 선언 해 봤자 소용이 없는 것을 확인 할 수 있습니다.
  결론적으로 TRIGGER안에는 COMMIT/ROLLBACK과 같이 DML 제어문은 사용 할 수가 없습니다.

Case3) TRIGGER안에 PRAGMA AUTONOMOUS_TRANSACTION 선언 한 경우
[참고] PARGMA AUTONOMOUS_TRANSACTION 옵션의 의미
: PKG 컴파일 시, DML작업이 오래 걸릴 경우, 작업이 끝날때 까지 기다리지 말고 다음 라인으로 넘어가라는
  명령어

2-3). TRIGGER생성

 3). 데이터 삽입 후 ROLLBACK / COMMIT일 경우 데이터가 어떻게 들어 가는지 확인!!

 4). 테스트 결과

: PRAGMA AUTONOMOUS_TRANSACTION 옵션으로 인해 ST_TABLE DML작업 후 BU_TABLE DML
  작업을 하고 또 다시 트리거를 만나 ST_TABLE, BU_TABLE DML 작업을 계속적으로 하다가..
  오라클에서 Setting되어 있는 일정 라인수를 만나게 되면서 Exception에 빠지게 되었고
  그러면서 에러를 발생 시켰습니다.
  
  만일 L_NO가 Unique Key값이 였다면 2번째 Looping 돌때 Unique 에러를 발생 시켰을 것입니다.
  위 예제는 L_NO가 Unique Key Column으로 생성을 안했기 때문에 계속적으로 DML작업을 하고 있는
  것을 확인 할 수가 있습니다.

위 3가지 예제에서 볼 수 있듯이 우리가 원하는 값은 나오지만 에러메세지는 계속적으로 발생이 되고 있습니다.
에러가 발생되는 프로그램을 주기적으로 사용 할 수가 없기 때문에 에러를 해결해야 되는데요.
해결방안은 여러 방법이 있지만 먼저 첫번째 방안으로 PKG를 사용하여 TEMP테이블에 담아 놓는 방법이 있습니다.

예제를 통해 알아 보도록 하겠습니다.

 1). TEMP TABLE 생성

 2). TRIGGER 재 생성

 3). PKG 생성(DBMS_JOB 에 등록 될 Package)

 ===========================================================
– Test Case
– Case1) ST_TABLE INSERT
– Case2) BU_TABLE INSERT
– Case3) ST_TABLE UPDATE
– Case4) BU_TABLE UPDATE
– Case5) ST_TABLE DELETE
– Case6) BU_TABLE DELETE
===========================================================

Case1) ST_TABLE INSERT

1-1). 데이터 삽입 후 ROLLBACK / COMMIT일 경우 데이터가 어떻게 들어 가는지 확인!!

 2). 테스트 결과

: PKG를 보시면 ST_TABLE에 Insert 하고 하는 Data가 있으면 Skip처리..
  Data가 없으면 DML작업을 수행 하도록 Validation Check 로직으로 인해 Insert가 안됨.

Case2) BU_TABLE INSERT

1-2). 데이터 삽입 후 ROLLBACK / COMMIT일 경우 데이터가 어떻게 들어 가는지 확인!!

 2). 테스트 결과

: PKG가 돌면서..
  ST_TABLE에 L_NO = 107 데이터가 없기 때문에 Insert 작업이 수행 된 것을 확인 할 수 있습니다.

Case3) ST_TABLE UPDATE

 1-3). 데이터 삽입 후 ROLLBACK / COMMIT일 경우 데이터가 어떻게 들어 가는지 확인!!

 2). 테스트 결과

: 이번 예제 또한 Validation Check로 인해 데이터는 Insert가 안 되었습니다.

Case4) BU_TABLE UPDATE

1-4). 데이터 삽입 후 ROLLBACK / COMMIT일 경우 데이터가 어떻게 들어 가는지 확인!!

 2). 테스트 결과

: 패키지 실행 후 데이터 Update 됨!!

Case5) ST_TABLE DELETE

1-5). 데이터 삽입 후 ROLLBACK / COMMIT일 경우 데이터가 어떻게 들어 가는지 확인!!

 2). 테스트 결과

: ST_TABLE이 Delete를 만나면서 BU_TABLE도 Delete가 되고 그로 인해 TRIGGER가 발생되어
  TARGET_T_TEMP테이블에 삭제 된 데이터를 삽입했다가 ST_TABLE에 데이터가 있으면 Skip..
  ST_TABLE에 데이터가 없으면 삭제!! 되는 것을 확인 할 수 있습니다.

Case6) BU_TABLE DELETE

1-6). 데이터 삽입 후 ROLLBACK / COMMIT일 경우 데이터가 어떻게 들어 가는지 확인!!

 2). 테스트 결과

: ST_TABLE이 Delete를 만나면서 BU_TABLE도 Delete가 되고 그로인해 TRIGGER가 발생되어
  TARGET_T_TEMP테이블에 삭제 된 데이터를 삽입했다가 ST_TABLE에 데이터가 있으면 Skip..
   ST_TABLE에 데이터가 없으면 삭제!! 되는 것을 확인 할 수 있습니다.

5. 결론

* TRIGGER는 단방향성으로 사용을 할 때는 효과적으로 사용 할 수가 있지만
   양방향성으로 사용 하게 되었을때는 여러 에러를 발생 시키는 것을 확인 할 수가 있었습니다. 

* 에러를 해결하기 위한 방법으로 PKG와 TEMP TABLE을 활용하여 에러를 해결 할 수 있는 것을
   확인 했습니다. (참고: PKG, PROCEDURE는 각 업무에 맞게끔 구성 해야 됩니다.)

 * TRIGGER는 양방향보다는 단방향성으로 사용 할 때 효과적인 것을 확인 할 수가 있습니다.

* 하기 URL은 오라클 클럽의 마농님께서 저와 다른 방법으로 트리거를 구성해 놓은 소스 입니다.
   이것 또한 참고하시면 훨씬 도움이 되실수 있을 듯 합니다^^
- 참고URL: http://www.gurubee.net/article/53504

Related Posts

1개의 댓글이 등록되었습니다
  1. 하대리.

    트리거 관련 데이터 동기화 테스트 하느라 고생했다.

    처음 칼럼 등록한거 맞아? 너무 잘 올렸는데? ^^

    앞으로 좋은 칼럼 많이 부탁한다!

Leave a Reply

댓글작성시 Code-Highlighter 삽입방법