我想有一個存儲過程,它將一條記錄插入到tableA中,並更新tableB中的記錄。如何創建其效果無法回滾的存儲過程?
存儲過程將在觸發器內被調用。
即使回滾觸發器的最外層事務,我也希望tableA中插入的記錄存在。
tableA中的記錄是線性鏈接的,我必須能夠重建線性連接。
只能通過觸發器寫入對錶A的訪問。
我該如何解決這個問題?
我想有一個存儲過程,它將一條記錄插入到tableA中,並更新tableB中的記錄。如何創建其效果無法回滾的存儲過程?
存儲過程將在觸發器內被調用。
即使回滾觸發器的最外層事務,我也希望tableA中插入的記錄存在。
tableA中的記錄是線性鏈接的,我必須能夠重建線性連接。
只能通過觸發器寫入對錶A的訪問。
我該如何解決這個問題?
您正在尋找的是自治事務,並且這些在SQL Server中目前不存在。請對下列項目進行表決/評論:
你可以考慮使用的xp_cmdshell或CLR的SQL引擎去外面回來做什麼(這些動作不能由SQL Server回滾)...但這些方法不是沒有他們自己的問題。
另一個想法是使用INSTEAD OF triggers - 您可以登錄/更新其他表格,然後決定不執行實際操作。
編輯
而且隨着@ VoodooChild的建議的線,你可以使用一個@table
變量來臨時保存你可以回滾之後引用數據 - 該數據將生存回滾,不像插入到#temp table
。
看到這個職位Logging messages during a transaction爲一個(有點令人費解)有效的方式實現你想要的東西:即使事務已經回滾,插入到日誌表仍然存在。 Simon提出的方法有幾個優點:不需要對調用者進行更改,快速且可擴展,並且可以在觸發器內安全使用。 Simon的例子是用於記錄,但插入可以用於任何事情。
一種方法是創建指向本地服務器的鏈接服務器。通過鏈接服務器執行的存儲過程將不會回滾:
EXEC LinkedServer.DbName.dbo.sp_LogInfo 'this won''t be rolled back'
您可以從觸發器調用遠程存儲過程。
你看過MSDN中的嵌套事務嗎? – Paparazzi
@BalamBalam - 嵌套事務不像您在SQL Server中預期的那樣工作。提交一個內部事務並回滾一個外部,內部也回滾。 – JNK
剛剛寫下我自己長久以來的問題時,偶然發現了這個問題,Aaron Bertrand的答案同樣適用於此問題,因此以下是一些關鍵字,以幫助谷歌:T-SQL中的並行事務/允許交易中的副作用 – Tao