테이블 롤백시 트리거... 질문 드립니다. 0 4 1,801

by 김실홍 [2016.03.07 16:44:41]


CREATE OR REPLACE TRIGGER triger_test
       AFTER
       UPDATE ON dept
       FOR EACH ROW
	   
	   BEGIN
        DBMS_OUTPUT.PUT_LINE('변경 전 컬럼 값 : ' || : old.dname);
        DBMS_OUTPUT.PUT_LINE('변경 후 컬럼 값 : ' || : new.dname);

       --이력테이블에 인서트 
     END;
     /

 

트리거 구조는 대충 위 처럼 되어있습니다

 

프로그래밍 단에서 

dept 에 업데이트가 여러건 일어나는 구조입니다

 

트랜젝션 시작

   FOR(반복문) {

       DETE 테이블 업데이트 프로시저 호출

   }

오류 없을시 커밋

오류 있는경우 롤백

 

 

위와 같은 로직해서..

트리거가 실행되는 시점을 알고싶습니다.

 

커밋일때 실행되나요?

아니면  DETE 테이블 업데이트 프로시저 호출 했을때... 업데이트 구문 이 끝나자 마자 실행되나요

 

전자이면 에러시 롤백때 트리거에서 입력된 이력 데이터도 같이 롤백되나요??

 

 

도움 부탁드립니다 

 

by 마농 [2016.03.07 17:11:00]

트리거는 개별 동작하는게 아닙니다.
원본 쿼리 동작의 일부분으로 동작할 뿐입니다.
원본쿼리 실행될 때 함께 실행되구요.
원본 쿼리 커밋/롤백 시 함께 커밋/롤백 됩니다.


by 김실홍 [2016.03.07 17:25:30]

답변 감사합니다 

그럴꺼라 생각했지만 

혹시나 해서 여쭤 봤습니다 ^^

 

 


by 겸댕2후니 [2016.03.07 17:57:10]

본문 외에 추가적으로 질문드리고 싶은게 있습니다.

TAB_1에 insert발생 시, TAB_2로 insert하는 트리거가 걸려있을 때,

TAB_1에 정상적으로 insert가 되었으나, 트리거 오류가 발생하여(id/pass 문제 등등)

TAB_2에는 정상적으로 insert가 발생하지 않았습니다.

이러한 경우, 정합성을 맞추려면 어떠한 방법이 있을까요?

즉, TABLE_1에는 정상 insert되고,  trigeer 오류 발생시,

TABLE_1에 insert된 데이터도 롤백되어야 하는 상황

 


by 마농 [2016.03.07 20:41:53]

겸댕2후니님.

대답은 마찬가지입니다.

트리거는 개별동작이 아닌 하나의 동작 중 일부분이라고 보셔야 됩니다.

개별 동작으로 잘못 이해하기 때문에 위와 같은 의문이 생기는 것입니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입