【问题标题】:SQL statements to ROLLBACK but Audit inserts to COMMITSQL 语句回滚但审计插入到 COMMIT
【发布时间】:2016-12-12 18:43:52
【问题描述】:

SQL Server 2012

我有一个主存储过程,它调用其他几个“子”存储过程。 主进程将子进程封装在事务中。

在主进程和子进程中,有许多插入到审计表中。

如果过程成功,我会得到一个详细的事件链。如果流程失败并回滚,我希望在 Audit 表中记录最后处理的子 proc,但整个事情都回滚了,包括审计数据。有没有办法在回滚子进程更改时选择性地提交审计插入?

谢谢

【问题讨论】:

    标签: sql-server sql-server-2012 transactions


    【解决方案1】:

    这几乎是一个“不”。在事务中对所做的所有工作(插入、更新、删除)都是孤注一掷。

    一个笨拙的手动选项是跟踪一个或多个变量中正在处理的数据,在过程之间来回传递它们。如果一切都已提交,则忽略变量;如果您必须回滚,您可以挖掘您想要保留的数据。

    【讨论】:

    • 一个令人印象深刻但功能强大的方法是将所有用于更新审计日志的 SQL 语句存储在 varchar(max) @variable 中,同时按顺序执行它们。如果过程失败并回滚,您可以通过变量中的 SQL 以及错误跟踪数据中的任何信息查看失败的位置,并适当更新日志。这甚至可以让您看到已回滚的记录信息,而无需所需的数据。它是一种拼凑和一种可怕的痛苦,但如果实施得当,它是准确的。
    【解决方案2】:

    您可以尝试在主过程中使用表变量,并将每个子过程的返回码插入到表变量中。表变量不受事务影响,而临时表受事务影响。

    在主过程结束时,您可以从表变量中选择以返回子过程的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-03
      • 1970-01-01
      • 2023-03-17
      • 2017-05-10
      • 2016-11-03
      • 1970-01-01
      • 2012-01-30
      相关资源
      最近更新 更多