2011-09-07 4 views
3

TRANSACTION에서 몇 가지 INSERT 및 UPDATE를 실행하는 SQL Server 2008 R2 저장 프로 시저가 있습니다. 각 문장이 끝나면 다음 단계를 수행하기 전에 일어난 일을 기록해야합니다.트랜잭션에서 이벤트를 기록하는 방법

BEGIN TRY 

    BEGIN TRANSACTION 

     INSERT INTO... -- 1st statement 
     INSERT INTO MyEventLog (EventDescription) VALUES ('Did Step 1') -- log 

     UPDATE... -- 2nd statement 
     INSERT INTO MyEventLog (EventDescription) VALUES ('Did Step 2') -- log 

    COMMIT TRANSACTION 

END TRY 

BEGIN CATCH 
    IF (@@TRANCOUNT<>0) ROLLBACK TRANSACTION 
    EXEC LogError 'I got an error' 
END CATCH 

문제는 다음과 같습니다 : - 내가 필요로 로깅을 포함 할 경우에 에러가 발생했을 경우, 트랜잭션이 다시 모든 문을 롤

여기 내 코드입니다. 오류가 발생하면 어떻게 트랜잭션을 롤백하지만 로깅은 유지합니까.

답변

1
난 당신이 기술적으로 발생하지 않은 이벤트를 기록 할 이유 트랜잭션이 롤백 된 것 때문에 물어 가고 있었다

데이터베이스는 트랜잭션 이전 상태였습니다. 그런데 내가 실패한 곳을 알기 위해 로그에 기록하기를 원했기 때문에 근본적인 문제를 해결할 수있었습니다. 이것은 현명한 일입니다.

그럴 경우 가장 좋은 방법은 현재 수행중인 전체 트랜잭션을 롤백하고 LogError SP를 사용하여 다른 테이블에 오류 메시지를 기록하는 것입니다.

CREATE PROCEDURE [dbo].[Error_Handler] 
@returnMessage bit = 'False' 
WITH EXEC AS CALLER 
AS 
BEGIN 

    DECLARE @number int, 
    @severity int, 
    @state int, 
    @procedure varchar(100), 
    @line int, 
    @message varchar(4000) 

    INSERT INTO Errors (Number,Severity,State,[Procedure],Line,[Message]) 
    VALUES (
    ERROR_NUMBER(), 
    ERROR_SEVERITY(), 
    ERROR_STATE(), 
    isnull(ERROR_PROCEDURE(),'Ad-Hoc Query'), 
    isnull(ERROR_LINE(),0), 
    ERROR_MESSAGE()) 

    IF(@returnMessage = 'True') 
    BEGIN 
    select * 
    from Errors 
    where ErrorID = scope_identity() 
    END 
END 

오류 메시지가 어떤 테이블에 무엇이 잘못되었는지 알려해야하고, 것을 문제를 해결하기에 충분한 정보이어야한다 : 이것은 내가 사용하는 것입니다.

0

로깅 문을 별도의 트랜잭션으로 처리하는 방법은 어떻습니까?

나는 CATCH 블록에 내려 놓고 것 :

BEGIN CATCH    
    IF (@@TRANCOUNT<>0) 
    ROLLBACK TRANSACTION   
    EXEC LogError 'I got an error' 
    BEGIN TRANSACTION 
    INSERT INTO MyEventLog (EventDescription) VALUES ('Error Updating') -- log 
    END TRANSACTION 
END CATCH 
+0

어떻게? 무슨 뜻인지 보여주는 코드 예제를 업데이트하십시오. 명령은 동일하게 유지되어야하며 비 loggin 명령문은 TRANS에 있어야합니다. –

1

Logging messages during a transaction을 참조하십시오. 조금 뒤얽힌 수 있습니다 :

그러나 트랜잭션 중에 메시지를 기록 할 수 있으며 트랜잭션이 롤백 되더라도 메시지가 지속됩니다. 로깅 순서가 유지됩니다.

하나의 절차가 실패하지만 트랜잭션을 계속할 수 있으면 트랜잭션 및 저장 프로 시저를 훌륭하게 수행해야합니다 (예 : 배치 처리 중 하나의 항목이 실패하면 나머지 배치를 계속 수행하려는 경우). Exception handling and nested transactions을 참조하십시오.

0

테이블 변수는 트랜잭션 의미론을 따르지 않습니다. 따라서 테이블 변수에 삽입 한 다음 catch 블록 다음에 로깅 테이블에 테이블 변수를 삽입 할 수 있습니다.

관련 문제