如何创建无法回滚效果的存储过程?

Jon*_*nno 4 t-sql sql-server stored-procedures transactions

我想有一个存储过程,将记录插入tableA并更新tableB中的记录.

将从触发器内调用存储过程.

我希望tableA中插入的记录存在,即使回滚触发器的最外层事务也是如此.

tableA中的记录是线性链接的,我必须能够重建线性连接.

对tableA的写访问权只能通过触发器进行.

我该怎么做?

Aar*_*and 9

您正在寻找的是自治事务,而今天SQL Server中不存在这些事务.请对以下项目进行投票/评论:

http://connect.microsoft.com/SQLServer/feedback/details/296870/add-support-for-autonomous-transactions

http://connect.microsoft.com/SQLServer/feedback/details/324569/add-support-for-true-nested-transactions

你可以考虑做的是使用xp_cmdshell或CLR来回到SQL引擎之外(SQL Server无法回滚这些操作)......但这些方法并非没有自己的问题.

另一个想法是使用INSTEAD OF触发器 - 您可以记录/更新其他表,然后决定不继续执行实际操作.

编辑

根据@ VoodooChild的建议,你可以使用一个@table变量临时保存你可以在回滚后引用的数据 - 这个数据将在回滚过程中存活,不像插入到#temp table.


Rem*_*anu 5

请参阅此文章在事务期间记录消息(有点复杂)实现所需的有效方法:即使事务已回退,也会保留对日志记录表的插入.Simon提出的方法有几个优点:不需要对调用者进行任何更改,速度快且可扩展,并且可以在触发器内安全使用.Simon的例子是用于记录,但插入可以用于任何事情.