【问题标题】:TSQL logging inside transaction事务内的 TSQL 日志记录
【发布时间】:2011-05-10 21:33:32
【问题描述】:

我正在尝试写入事务中的日志文件,以便即使事务回滚,日志仍然存在。

--开始代码

开始翻译

将 [某事] 插入 dbo.logtable

[[这里的主代码]]

回滚

提交

--结束代码

您可以说只是在事务开始之前记录日志,但这并不容易,因为事务在此 S-Proc 运行之前开始(即代码是更大事务的一部分)

所以,简而言之,有没有办法在不属于事务的事务中编写特殊语句。我希望我的问题有意义。

【问题讨论】:

标签: sql-server tsql logging transactions


【解决方案1】:

如果你想模拟嵌套事务行为,你可以使用命名事务:

begin transaction a

create table #a (i  int)

select * from #a
save transaction b

create table #b (i  int)
select * from #a
select * from #b

rollback transaction b

select * from #a
rollback transaction a

在 SQL Server 中,如果您想要一个“子事务”,您应该使用save transaction xxxx,它的作用类似于 oracle 检查点。

【讨论】:

  • 这个答案根本没有回答这个问题。 OP 没有询问子交易,恰恰相反。他希望将某些操作排除在事务上下文之外并直接提交到数据库中。
  • 我的回答是对上面的评论 - 我认为回答得非常简洁
【解决方案2】:

如果父事务回滚,则日志记录数据也会回滚 - SQL Server 不支持正确的嵌套事务。一种可能性是使用 CLR 存储过程进行日志记录。这样就可以在事务外打开自己与数据库的连接,输入并提交日志数据。

【讨论】:

  • 使用 CLR 记录程序是最好的解决方案之一。如果有可能以某种方式自动获取调用 sproc 的参数的实际值..我们总是可以梦想。
【解决方案3】:

根据我当时的需要,我会选择两种方式中的一种。两者都涉及使用变量,该变量在回滚后保留其值。

1) 创建一个DECLARE @Log varchar(max) 值并使用它:@SET @Log=ISNULL(@Log+'; ','')+'Your new log info here'. Keep appending to this as you go through the transaction. I'll insert this into the log after the commit or the rollback as necessary. I'll usually only insert the @Log value into the real log table when there is an error (in theCATCH` 块)或如果我'我正在尝试调试问题。

2) 创建一个DECLARE @LogTable table (RowID int identity(1,1) primary key, RowValue varchar(5000)。当您进行交易时,我会插入此内容。我喜欢使用OUTPUT 子句将事务中使用的行的实际ID(以及其他带有消息的列,如'DELETE item 1234')插入到此表中。我会根据需要在提交或回滚之后将此表插入到实际的日志表中。

【讨论】:

  • 这两个都很好,只是我无法轻松访问事务部分。基本上我正在尝试调试用 C# 编写的程序。
  • (让我们完成这个:-) c# 代码启动一个事务,然后调用一个 s-proc,最后它提交或回滚事务。我只能轻松访问 s-proc,我希望我可以在那里做一些调试代码,以便在回滚后幸存下来
  • 您可以尝试使用xp_cmdshell (Transact-SQL)(但可能会因为安全风险而被关闭)将这些包含在您的过程中:EXEC xp_cmdshell echo 'your message here' >>log.txt 写入文件。您也可以尝试使用输出参数 @ErrorInfo varchar(max)` 将错误信息传递回 C# 程序,以便它可以记录它。
【解决方案4】:

使用表变量 (@temp) 保存日志信息。表变量在事务回滚后仍然存在。

this article

【讨论】:

  • 正是我要建议的。我已经成功使用过很多次了。
  • 这个问题是如果发生其他任何事情,例如连接超时或执行超时,您将没有日志。
猜你喜欢
  • 1970-01-01
  • 2020-11-17
  • 2011-09-26
  • 2010-12-27
  • 2020-04-17
  • 1970-01-01
  • 2016-09-16
  • 2011-02-27
  • 1970-01-01
相关资源
最近更新 更多