我有一个表,其中包含 uploaddate
和 systemuser
列,以及一个用于为新记录添加用户和日期的触发器
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 个新列:changedate
和 changeuser
。
我的目标是更新由用户和日期更改的记录。但不要更改 UploadDate
和 SystemUser
列中的信息。
这是我的第二个触发器
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
但这不起作用,我收到此错误
Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32)
最佳答案
基于我们正在处理 Microsoft SQL Server 的代码和错误消息。
看起来您的数据库配置为 recursive triggers.
要禁用直接递归触发器(即由同一更新触发器在表上进行的更新触发的更新触发器),您可以使用 alter database
禁用递归触发器:
ALTER DATABASE MyDataBase SET RECURSIVE_TRIGGERS OFF;
GO
您还可以将触发器嵌套级别设置为 0 以禁用直接和间接触发器递归,但我建议谨慎使用此步骤 - 特别是在您使用触发器来强制执行业务规则时。
EXEC sp_configure 'nested triggers', 0 ;
GO
RECONFIGURE;
GO
关于sql - 插入和更新触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52707829/