是的,你可以做到這一點,用一些:您可以使用這些功能複雜性和侷限性。這不是一個建議,只是一個答案。
SQLServer提供內置函數,例如用於catch塊的ERROR_MESSAGE(),ERROR_NUMBER()。
如果您的插入/刪除代碼以自動合併模式運行(不開始tran,沒有隱式事務),那麼只需在catch塊中記錄錯誤消息和編號就可以工作,因爲插入和刪除操作已經回滾或提交。
所以
begin try
-- do work
end try
begin catch
insert into audit_table select ERROR_MESSAGE(), ERROR_NUMBER()
end catch
可以工作。
如果您的TSQL代碼或客戶端使用begin tran或隱式事務,則catch塊中的邏輯必須考慮這一點,否則當原始事務回滾時不會記錄錯誤記錄,的錯誤。
如果你有這樣的事情......
begin try
begin tran
-- do work
if xact_state() = 1 commit tran
if xact_state() = -1 rollback tran
end try
begin catch
-- Now there is a good chance a transaction is still pending or uncomittable.
if xact_state() != 0 rollback tran -- assuming you always rollback.
-- Insert will be recorded because previous transaction was cleared.
insert into audit_table select ERROR_MESSAGE(), ERROR_NUMBER()
end catch
如果不提交或在catch塊回滾,您的交易是uncomittable,您的插入最終回滾,你有沒有記錄錯誤。
如果客戶端正在管理事務,則可能無法記錄錯誤信息,除非客戶端與發出回滾的錯誤處理程序沒有問題。發佈回滾本身可能會產生一個掩蓋真正根本原因的錯誤。如果客戶正在管理交易,就不需要考慮複雜性,讓客戶也可以更容易地捕捉和記錄錯誤。
+1:哦,ERROR_()函數的樂趣! – MatBailie