2008-11-06 4 views
2

ADO.net에서 Oracle을 호출 할 때 루프에서 여러 삽입을 호출 할 때 각 삽입이 트리거를 발생시켜 PL-SQL에서 Commit 문을 포함하는 호출을 중지 할 수 없다고 들었습니다. 실제로 트랜잭션을 커밋하지 않아도됩니다.ADO.NET에서 사용하고 트리거를 사용할 때 Oracle 트랜잭션 범위?

즉, 루프가 시작되기 전에 ADO.Net 코드가 트랜잭션을 시작하도록하고 루프가 종료되면 루프의 모든 삽입이 성공한 경우에만 모든 삽입을 커밋합니다. 내 출처는 이러한 트리거에 COmmit 문이 포함 된 경우 오라클의 작동 방식을 알려주고 있으며 이는 불가능합니다.

이것은 매우 일반적인 요구 사항 인 것으로 보이며 SQL Server에서 가능하다는 것을 알고 있습니다. 나에게 맞는 것 같지 않아.

이 정보가 맞습니까? 그는 Oracle 데이터베이스에 대해 얘기하면

+0

기다림, SQL Server에서 정확히 무엇이 가능합니까? 자치 Txns? 방아쇠를 당기는거야? –

+0

SQL Server에서 모든 Begin Transaction은 @@ TranCount라는 내장 트랜잭션 범위 변수를 사용하여 액세스 할 수있는 카운터를 증가시킵니다. 그런 다음 모든 Commit Transactiopn 문에서 SQL 문을 감소시키고 DB는 @TranCount = 0 일 때만 커밋합니다. –

+0

SQL Server 문서에서 : BEGIN TRANSACTION 문은 @@ TRANCOUNT를 1 씩 증가시킵니다. ROLLBACK TRANSACTION은 @@ TRANCOUNT를 0으로 줄입니다 @@ TRANCOUNT에 영향을주지 않는 ROLLBACK TRANSACTION savepoint_name의 경우. COMMIT TRANSACTION 또는 COMMIT WORK는 @@ TRANCOUNT를 1 씩 감소시킵니다. –

답변

6

귀하의 정보 제공자가 잘못 트리거 :

1) 당신은 자율이 아닌 오라클 트리거에 COMMIT 넣지 수 :

SQL> create trigger this_wont_work 
    2 after insert on emp 
    3 begin 
    4 commit; 
    5 end; 
    6/

Trigger created. 

SQL> insert into emp (empno) values (123) 
    2/
insert into emp (empno) values (123) 
      * 
ERROR at line 1: 
ORA-04092: cannot COMMIT in a trigger 
ORA-06512: at "TONY.THIS_WONT_WORK", line 2 
ORA-04088: error during execution of trigger 'TONY.THIS_WONT_WORK' 

2) 만약 트리거는 자율적입니다 (예 : 선언 섹션에 PRAGMA AUTONOMOUS_TRANSACTION이 있음). 그러면 트리거 (트리거)가 변경 한 사항 만 커밋 할 수 있습니다.

트리거 밖에서 작업 한 트리거가 아무런 위험이 없습니다.

주 : 트리거링 문이 롤백되는 경우에도 자율적 인 트리거가 수행하는 작업이 커밋되기 때문에 트리거에서 자치 트랜잭션을 사용하는 것은 위험합니다. 잘못 사용하면 쉽게 데이터 손상이 발생할 수 있습니다.

+0

예, 발견했습니다. 그래서 다시, 내가 뭘하고 싶은지, 내 ADO.Net 클라이언트 코드가 외부에 커밋하도록 데이터베이스를 알릴 때까지 트리거 커밋을 금지합니다. 그런 다음 모든 트리거 작업을 포함하여 루프 시작 부분에서 트랜잭션을 시작한 이후로 데이터베이스가 모든 보류중인 작업을 커밋하도록합니다. –

+0

찰스, 트리거는 자율적 인 경우가 아니면 뭘 원하는지 정확하게 알 수 있습니다. 그들이 자율적이라면, 당신은 그들이 언제 저지른지를 통제 할 수 없으며 아마도 누군가 그런 식으로 그렇게 한 이유가있을 것입니다. –

+0

트리거에는 COMMIT 및 PRAGMA AUTONOMOUS_TRANSACTION이 포함되어 있습니까? 그렇다면, 당신이 그것을 원하지 않는 이유는 무엇입니까?! –

관련 문제