我正在编码SQL Server 2005触发器。我想在触发器执行过程中使用INSERT语句到我的日志表中进行一些日志记录。当执行期间发生错误时,我想提出错误并取消导致触发器执行的操作,但不要丢失日志记录。实现此目标的最佳方法是什么?
现在,我的触发器记录了所有情况,但发生错误时(由于ROLLBACK的原因)除外。为了通知调用程序错误,需要RAISERROR语句。
现在,我的错误处理代码如下所示:
if (@err = 1) begin INSERT INTO dbo.log(date, entry) SELECT getdate(), 'ERROR: ' + out from #output RAISERROR (@msg, 16, 1) rollback transaction return end
另一个可能的选择是使用 表变量 来捕获要存储在永久日志表中的信息。如果给出了ROLLBACK TRANSACTION命令,则不会回滚表变量。示例代码如下…
--- Declare table variable DECLARE @ErrorTable TABLE ( [DATE] smalldatetime, [ENTRY] varchar(64) ) DECLARE @nErrorVar int --- Open Transaction BEGIN TRANSACTION --- Pretend to cause an error and catch the error code SET @nErrorVar = 1 --- @@ERROR IF (@nErrorVar = 1) BEGIN --- Insert error info table variable INSERT INTO @ErrorTable ( [Date], [Entry] ) SELECT getdate(), 'Error Message Goes Here' RAISERROR('Error Message Goes Here', 16, 1) ROLLBACK TRANSACTION --- Change this to actually insert into your permanent log table SELECT * FROM @ErrorTable END IF @@TRANCOUNT 0 PRINT 'Open Transactions Exist' ELSE PRINT 'No Open Transactions'