2011-01-19 58 views
1

我需要将一些日志数据保留在不同的表中,即使我的事务回滚了。在模拟自治事务的SQL Server 2005中

我已经了解到,在SQL Server中这是不可能做这样的事情

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

所以我尝试黑客 SQL服务器,我madded CLR这是要导出数据需要记录到本地服务器硬盘以XML格式。 CLR代码很简单,因为它可以:

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

我发布这个在生产基地生病喜欢听到这种技术的恶棍之前。

这里有几个问题:

  • 是否有其他更好的办法在SQL Server中实现自治事务2005
  • 怎么能坏的握着我的事务的未提交而SQL Server正在执行CLR(写入的数据量通过SQL是相对较小的约50 - 60纪录的3个整数和4个浮点)
+0

您是否已阅读此文章? http://blogs.msdn.com/b/sqlprogrammability/archive/2008/08/22/how-to-create-an-autonomous-transaction-in-sql-server-2008.aspx – 2011-01-19 16:30:35

回答

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而言。但这只是能够绕过交易的明显折衷。