sql - 插入和更新触发器

标签 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

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

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/

相关文章:

sql-server - SQL Server 2016 中的 SQL Server 配置管理器在哪里

mysql - 更新前触发会导致错误 #1442

triggers - 插入触发器插入值返回

php - 使用php上传文件并将路径保存到sql

sql - 一条语句中的多个游标

sql - 数据库设计用户表拆分或单一

mysql - 需要更正以下触发器中的语法错误,使用 phpMyAdmin 来执行它

c# - 无效操作异常 : No columns were selected when performing a DELETE query

sql-server - 尝试同时运行 Delete 语句时,KEY Lock 上的 SQL Server 死锁

sql-server - "Error in srv_paramset."执行 sp_OAGetProperty