sql - 登录到 SQL Server 触发器中的表

标签 sql sql-server logging triggers

我正在编写 SQL Server 2005 触发器。我想在触发器执行期间使用 INSERT 语句到我的日志表中进行一些日志记录。当执行过程中发生错误时,我想引发错误并取消导致触发器执行的操作,但不丢失日志记录。实现这一目标的最佳方法是什么?

现在我的触发器会记录除出现错误时的情况之外的所有内容 - 由于回滚。需要 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'

关于sql - 登录到 SQL Server 触发器中的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2809659/

相关文章:

sql - 从两个表到单个 View 的 T-SQL 层次结构

SQL 连接不同值

sql-server - 集成服务目录文件夹权限已更改

SQL 查询 - 确保 () 中的每个值都存在一行

SQL 为什么 SELECT COUNT(*) , MIN(col), MAX(col) 比 SELECT MIN(col), MAX(col) 更快

.net - 可移植类库的任何日志记录框架?

sql - 如何记录 PostgreSQL 查询?

xml - 如何将 Subversion 日志导出到电子表格

sql - Oracle SQL [1..*] 关系 |在 [...*] 中排序后,从 [1...] 中选择所有行 + 从 [...*] 中选择顶行

sql - 为什么我的 SQL 索引被忽略?