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 次的主要内容,如果未能解决你的问题,请参考以下文章