在SQL Server触发器中登录表

Mar*_*tin 4 sql sql-server logging triggers

我正在编写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
Run Code Online (Sandbox Code Playgroud)

小智 7

另一种可能的选择是使用表变量来捕获要存储在永久日志表中的信息.如果给出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'
Run Code Online (Sandbox Code Playgroud)