database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 12266 게시물 읽기
No. 12266
Trigger 의 AUTONOMOUS_TRANSACTION 에 관련된 질문
작성자
카니(kanisuka)
작성일
2002-10-16 17:31
조회수
7,317

하나의 일련 작업이 있습니다.

 

a 라는 작업, b 라는 작업, c 라는 작업...

 

그런데 이 중 작업을 하다가 하나라도 에러가 나는 순간에

 

모든 작업들이 rollback이 되어야 합니다.

 

그런데 b 라는 작업이 있는데 트리거에 관련된 작업입니다.

 

해당 트리거 내에는

 

PRAGMA AUTONOMOUS_TRANSACTION;

 

이라는 구문이 있습니다.

 

이 구문을 빼면은

 

execute immediate 'alter trigger b.b_duplicate disable';

 

이 부분에서 에러가 납니다.

 

에러 내용은

 

1행에 오류:

ORA-04092: 트리거 안에 COMMIT를 할 수 없습니다

ORA-06512: "B.B_DUPLICATE", 줄 4에서

ORA-04088: 트리거 'B.B_DUPLICATE'의 수행시 오류

 

이런 내용입니다. 추측건데 execute 구문 안에서 자동으로

 

commit 을 실행하는 것 같은데, 트랜잭션 처리를 위해서

 

좋은 방법이 없을까요?

 

참고로 a 에서 트랜잭션을 시작해서 c 에서 commit 을 해주는 형태로

 

프로그램을 만들었습니다.

 

그런데 b 라는 트리거 작업에서 트랜잭션이 다시 들어가니깐

 

만약 에러가 날 시에 모두 롤백이 된다는 보장이 없는거 같더군요

 

움...고수님들 도와주세요 ^-^a

이 글에 대한 댓글이 총 2건 있습니다.

정확히 어떤문제인지 모르겠지만

님은 아마도

PRAGMA AUTONOMOUS_TRANSACTION

에 대해 알아보시지않고 그냥쓰신듯 한데

결론만 말씀드리면

DECLARE

PRAGMA AUTONOMOUS_TRANSACTION;

Begin

execute immediate 'alter trigger...';

begin

insert into ...;

insert into ...;

insert into ...;

insert into ...;

commit;

exception

when OTHERS then

rollback;

end;

execute immediate 'alter trigger...';

end;

처럼 내부 transaction처리로

님에 고민에 도움이 될는디 모르겠군요.

한번 테스트해보세요.

PRAGMA AUTONOMOUS_TRANSACTION쓰실때

exception구현을 잘 생각해서 사용하시고

구현이 용이치 않으면 procedure로 빼내서

트리거로 프로시져를 실행시키시면 많은 부분이 해결되리라고 생각되어집니다.

exception처리는 업무마다 시스템구성마다 달라지므로 정답을 찾기가 쉽지않습니다.

어느경우는 수작업밖에 방법이 없을경우도 있습니다.

건투를 빕니다.

junkk님이 2002-10-17 16:30에 작성한 댓글입니다.

CREATE OR REPLACE TRIGGER b_duplicate AFTER

INSERT ON REP_TBL

FOR EACH ROW

DECLARE

\tduplicate_info EXCEPTION;

\tPRAGMA EXCEPTION_INIT (duplicate_info, -00001);

\tPRAGMA AUTONOMOUS_TRANSACTION;

BEGIN

\texecute immediate 'alter trigger a.a_duplicate disable';

\tinsert into a.rep_tbl values(:new.user_id, :new.name);

\texecute immediate 'alter trigger a.a_duplicate enable';

 

EXCEPTION

\tWHEN duplicate_info THEN

\tRAISE_APPLICATION_ERROR (-20108,'Duplicate customer or order ID');

 

END;

/

 

commit 이나 rollback 처리를 안 하고

 

위처럼 썼을 경우에 위의 트리거가 실행도중 에러가

 

발생하면은 메인 트랜잭션도 롤백이 되나요?

 

CREATE OR REPLACE TRIGGER b_duplicate AFTER

INSERT ON REP_TBL

FOR EACH ROW

DECLARE

\tduplicate_info EXCEPTION;

\tPRAGMA EXCEPTION_INIT (duplicate_info, -00001);

\tPRAGMA AUTONOMOUS_TRANSACTION;

BEGIN

\texecute immediate 'alter trigger a.a_duplicate disable';

\tinsert into a.rep_tbl values(:new.user_id, :new.name);

\texecute immediate 'alter trigger a.a_duplicate enable';

\tcommit;

EXCEPTION

\tWHEN duplicate_info THEN

\tRAISE_APPLICATION_ERROR (-20108,'Duplicate customer or order ID');

\trollback;

END;

/

첫번째 경우와 두번째 경우의 차이점을 알고 싶습니다

 

움...오라클 문서 읽어봐도 좀 헷갈리네요 ^^a

카니(kanisuka)님이 2002-10-18 13:22에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
12269검색 [1]
신호
2002-10-17
1660
12268솔라+oracle8.1.7설치하는데 pro c를 설치하려면 [1]
솔라리
2002-10-16
1374
12267import할때요... [1]
lee
2002-10-16
2485
12266Trigger 의 AUTONOMOUS_TRANSACTION 에 관련된 질문 [2]
카니
2002-10-16
7317
12264disable 시켰던 primary key를 enable 시 에러가... [2]
눈숭이
2002-10-16
3760
12263Update시 subquery에 대한 질문 [1]
궁상만땅
2002-10-16
2350
12262raw device를 파티션상에 추가해줄때 용량을 얼마정도로 해야되나요?
김형욱
2002-10-16
1884
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2025 DSN, All rights reserved.
작업시간: 0.011초, 이곳 서비스는
	PostgreSQL v17.4로 자료를 관리합니다