插入和更新触发器

时间:2018-10-08 18:04:11

标签: sql sql-server triggers

我有一个包含列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)

1 个答案:

答案 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