SQL Server 触发器触发 3 次

Posted

技术标签:

【中文标题】SQL Server 触发器触发 3 次【英文标题】:SQL Server trigger firing 3 times 【发布时间】: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? 您创建一个更新触发器,然后在触发器内执行更新...尝试从触发器中删除更新语句... 【参考方案1】:

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

检查这个解决方案

How do I prevent a database trigger from recursing?

【讨论】:

【参考方案2】:

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

IF NOT UPDATE(business_process)
    RETURN;

更多信息:UPDATE()

【讨论】:

【参考方案3】:

使用以下代码避免嵌套

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

【讨论】:

以上是关于SQL Server 触发器触发 3 次的主要内容,如果未能解决你的问题,请参考以下文章

SQL SERVER 触发器的误区

MS SQL Server 全表搜索触发器语句怎么写?

SQL SERVER-限制教师授课超过3个班级的触发器

帮助 SQL Server 触发器在插入前截断错误数据

SQL Server写触发器遇到的问题:列前缀与表名或别名不匹配

SQL Server 触发器