首页 > 解决方案 > 插入和更新触发器

问题描述

我有一个包含列的表uploaddatesystemuser一个触发器来为新记录添加用户和日期

USE [ITPrinter]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [dbo].[trg01]
ON [dbo].[Printers]
FOR INSERT
AS 
BEGIN
    SET NOCOUNT ON;

    UPDATE Printers
    SET UploadDate = GETDATE(), SystemUser = SUSER_SNAME()
    WHERE id IN (SELECT ID FROM inserted)
END

它工作正常。

现在我创建 2 个新列,changedatechangeuser在同一个表中。我的目标是更新由用户和日期更改的记录。但不要更改列UploadDateSystemUser.

这是我的第二个触发器

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [dbo].[trg02]
ON [dbo].[Printers]
AFTER UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    UPDATE p
    SET p.ChangeDate = GETDATE(), p.ChangeUser = SUSER_SNAME()
    FROM Printers p
    INNER JOIN inserted i ON p.id = i.id

但这不起作用,我收到此错误

超出最大存储过程、函数、触发器或视图嵌套级别(限制 32)

标签: sqlsql-servertriggers

解决方案


基于我们正在处理 Microsoft SQL Server 的代码和错误消息。

看起来您的数据库已配置为递归触发器。

要禁用直接递归触发器(意思是由同一个更新触发器在表中进行的更新触发的更新触发器),您可以使用以下命令禁用递归触发器alter database

ALTER DATABASE MyDataBase SET RECURSIVE_TRIGGERS OFF;
GO

您还可以将触发器嵌套级别设置为 0 以禁用直接和间接触发器递归,但我建议谨慎使用此步骤 - 特别是如果您使用触发器来强制执行业务规则。

EXEC sp_configure 'nested triggers', 0 ;  
GO  
RECONFIGURE;  
GO  

推荐阅读