2011-09-12 64 views
4

我想有一個存儲過程,它將一條記錄插入到tableA中,並更新tableB中的記錄。如何創建其效果無法回滾的存儲過程?

存儲過程將在觸發器內被調用。

即使回滾觸發器的最外層事務,我也希望tableA中插入的記錄存在。

tableA中的記錄是線性鏈接的,我必須能夠重建線性連接。

只能通過觸發器寫入對錶A的訪問。

我該如何解決這個問題?

+0

你看過MSDN中的嵌套事務嗎? – Paparazzi

+0

@BalamBalam - 嵌套事務不像您在SQL Server中預期的那樣工作。提交一個內部事務並回滾一個外部,內部也回滾。 – JNK

+0

剛剛寫下我自己長久以來的問題時,偶然發現了這個問題,Aaron Bertrand的答案同樣適用於此問題,因此以下是一些關鍵字,以幫助谷歌:T-SQL中的並行事務/允許交易中的副作用 – Tao

回答

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 triggers - 您可以登錄/更新其他表格,然後決定不執行實際操作。

編輯

而且隨着@ VoodooChild的建議的線,你可以使用一個@table變量來臨時保存你可以回滾之後引用數據 - 該數據將生存回滾,不像插入到#temp table

5

看到這個職位Logging messages during a transaction爲一個(有點令人費解)有效的方式實現你想要的東西:即使事務已經回滾,插入到日誌表仍然存在。 Simon提出的方法有幾個優點:不需要對調用者進行更改,快速且可擴展,並且可以在觸發器內安全使用。 Simon的例子是用於記錄,但插入可以用於任何事情。

4

一種方法是創建指向本地服務器的鏈接服務器。通過鏈接服務器執行的存儲過程將不會回滾:

EXEC LinkedServer.DbName.dbo.sp_LogInfo 'this won''t be rolled back' 

您可以從觸發器調用遠程存儲過程。