2011-01-19 5 views
1

트랜잭션이 롤백 되더라도 일부 테이블의 로그 데이터를 유지해야합니다. 이미 SQL 서버에이 불가능하다는 것을 알게SQL Server 2005에서 자율 트랜잭션을 에뮬레이트하는 경우

begin tran t1 
insert ... 
insert ... 
select ... 
     begin tran t2 
     insert into log 
     commit tran t2 
rollback tran t1 
select * from log -- IS EMPTY ALWAYS 

그래서 시도 같은 데이터가 로컬 서버 디스크에 LOG에 필요한 수출하는 것입니다 내가 CLR을 madded SQL 서버를 해킹 할 XML 형식.

File.WriteAllText(fileName, xmlLog.Value.ToString()); 

나는이 기술에 대해 toughs을 듣고 아픈 사랑 생산 기지에서 이것을 해제하기 전에 :이 될 수있는 CLR 코드는 간단하다.

  • 가 SQL 서버에 기록 된 데이터의 2005
  • SQL Server가 CLR을 실행하는 동안 커밋되지 않은 내 거래를 잡고 나쁜 할 수있는 방법을
  • (양을 자율 트랜잭션을 수행하는 다른 더 좋은 방법이 있나요 :

    여기에 몇 가지 질문 있습니다 SQL에 의해 상대적으로 작은 - 3 정수 및 4 플로트의 약 50 - 60 레코드

+0

이 기사를 이미 읽었습니까? http://blogs.msdn.com/b/sqlprogrammability/archive/2008/08/22/how-to-create-an-autonomous-transaction-in-sql-server-2008.aspx –

+0

@Martin 부분적으로 내가 그랬다. 하지만 기술은 MSSQL 2008에서만 가능하다고 생각합니다. 2005 년에도 내 생산은 여전히 ​​진행 중입니다. – adopilot

+0

저자 하단에 3 가지 대안이 있습니다. –

답변

3

테이블 변수는 트랜잭션의 영향을받지 않으므로 사용하는 것이 좋습니다 (언급 된 블로그에 나열된 방법 중 하나입니다. 마틴 벨 오우). 고려 SQL Server 2005에서 작동하는이, 일 :

DECLARE @TempLog TABLE (FieldList...) 

BEGIN TRY 

    BEGIN TRAN 

    INSERT... 

    INSERT INTO @TempLog (FieldList...) VALUES (@Variables or StaticValues...) 

    INSERT... 

    INSERT INTO @TempLog (FieldList...) VALUES (@Variables or StaticValues...) 

    COMMIT TRAN 

END TRY 
BEGIN CATCH 

    IF (@@TRANCOUNT > 0) 
    BEGIN 
     ROLLBACK TRAN 
    END 

    /* Maybe add a Log message to note that we ran into an error */ 
    INSERT INTO @TempLog (FieldList...) VALUES (@Variables or StaticValues...) 

END CATCH 

INSERT INTO RealLogTable (FieldList...) 
    SELECT FieldsList 
    FROM @TempLog 

유의하시기 바랍니다 우리는이 코드가하는 경우 잠재적 인 상황을 만들 않는 테이블 변수는 트랜잭션의 일부가 아닌 사실의 사용을하는 동안 COMMIT하지만 INSERT INTO RealLogTable 앞에 오류 (또는 서버가 충돌)가 발생하면 데이터를 기록한 데이터가 손실됩니다.이 시점에서 데이터가 없으므로 연결이 끊어집니다. RealLogTable에 관한 한. 그러나 이것은 거래를 우회 할 수있는 분명한 트레이드 오프 일뿐입니다.

관련 문제