【问题标题】:SQL Server trigger firing 3 timesSQL Server 触发器触发 3 次
【发布时间】:2017-09-20 13:41:39
【问题描述】:

我已设置以下审核触发器,以在我的更改日志中创建记录更改的副本(如果我们需要查看我们的数据发生了什么)。问题是每次我更新记录时,它都会在我的日志表中创建 3 条记录。

您可以在下面看到结果集和我一直在使用的代码。

代码:

/*  ==Scripting Parameters==
    Source Server Version : SQL Server 2016 (13.0.4446)
    Source Database Engine Edition : Microsoft SQL Server Standard Edition
    Source Database Engine Type : Standalone SQL Server

    Target Server Version : SQL Server 2017
    Target Database Engine Edition : Microsoft SQL Server Standard Edition
    Target Database Engine Type : Standalone SQL Server
*/

USE [STONE_DB]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [dbo].[tr_set_for_update_audit_fields]
ON [dbo].[permission_types]
FOR UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    INSERT INTO STONE_DB_CHANGE_LOGS.dbo.permission_types_log ([permission_type_id], [business_process], [active], [created_at], [created_by], [change_type], [change_user], [change_at])
        SELECT DISTINCT 
            inserted.id, 
            inserted.[business_process], inserted.[active],
            inserted.[created_at], inserted.[created_by],
            'U', SYSTEM_USER, GETDATE()
        FROM 
            inserted
        WHERE 
            1 = 1
            AND inserted.[created_at] < getdate();

        UPDATE [dbo].[permission_types]
        SET updated_at = GETDATE(), updated_by = SYSTEM_USER
        FROM [dbo].[permission_types] 
        INNER JOIN inserted ON permission_types.id = inserted.id
        WHERE 1 = 1
          --AND permission_types.updated_at < getdate() 
        ;

        PRINT 'Record Updated'
END

【问题讨论】:

  • permission_types 表中是否存在多次相同的 id?
  • 您创建一个更新触发器,然后在触发器内执行更新...尝试从触发器中删除更新语句...

标签: sql-server triggers


【解决方案1】:

您需要防止数据库触发器递归

检查这个解决方案

How do I prevent a database trigger from recursing?

【讨论】:

    【解决方案2】:

    你应该在触发器代码的开头添加这样的:

    IF NOT UPDATE(business_process)
        RETURN;
    

    更多信息:UPDATE()

    【讨论】:

      【解决方案3】:

      使用以下代码避免嵌套

      IF((SELECT trigger_nestlevel() ) > 1) 返回

      【讨论】:

        猜你喜欢
        • 2021-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多