我有一个包含列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
但是这不起作用,我得到了这个错误
超出了最大存储过程,函数,触发器或视图嵌套级别(限制32)
答案 0 :(得分:3)
基于我们正在处理的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