trigger 에서 TCL (commit , rollback , savepoint) 사용하는법 질문 드립니다. 0 2 949

by CIVIC [PL/SQL] trigger tcl 사용방법 [2018.03.22 21:24:48]


안녕하세요

제가 공부하기로는

트리거는 지정한 이벤트(DML)가 발생할 때마다 자동으로 실행되는 pl/sql와 sql 명령 객체

이고 호출문 없이 자동 호출된다고 배웠습니다.

그리고 데이터 흐름 제어문 TCL 을 기본값으로는 사용할 수 없다고 배웠습니다.

그럼 TCL을 사용하기 위해서는 어떻게 하는 방법이 있나요?

트리거의 기본값을 바꾸는 방법이 있는건가요?

아니라면 엄청 쉬운 방법이 있는 건가요?

너무 궁금해서 질문 올립니다.

create or replace trigger update_error_t
	after update of sal on emp
	for each row
begin
	insert into black_list(bno , bsal , bafter) values(:old.empno , :old.sal , :new.sal);
	raise_application_error(-20001 , '사원 급여 변경 못해요');
	commit;	
end;
/

이렇게 작성한 이유는 블랙 리스트라는 테이블을 만들어 놓고

emp 테이블의 급여를 변경 못하게 하고 만약 하려고 하면 ,

블랙 리스트에 하려고 했던 내용을 추가하려고 했습니다.

어떻게 하면 가능한지 너무 궁금합니다.

by CIVIC [2018.03.22 22:16:55]
create or replace trigger update_error_t
    after update of sal on emp
    for each row
declare
    PRAGMA autonomous_transaction;
begin
    insert into black_list(bno , bsal , bafter) values(:old.empno , :old.sal , :new.sal);
    commit;
    raise_application_error(-20001 , '사원 급여 변경 못해요'); 
end;
/

결국 우선 해결 했는데

저와 같은 고민을 하는 분들을 위해서 글은 지우지 않겠습니다.

PRAGMA autonomous_transaction; 에 대해서 아는게 없는데 혹시

배울수 있는 파트가 어딘지 알려주실수 있으신가요??


by 마농 [2018.03.23 07:57:05]

커밋/롤백 하기전까지는 하나의 트렌젝션입니다.
하나의 트랜젝션 안에서 독립적으로 운영되는 트렌젝션을 선언하는 구문입니다.
트리거 자체에 선언하기 보다는 입력용 프로시져를 별도로 사용하는건 어떨까요?

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