sql - 插入和更新触发器
问题描述
我有一个包含列的表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)
解决方案
基于我们正在处理 Microsoft SQL Server 的代码和错误消息。
看起来您的数据库已配置为递归触发器。
要禁用直接递归触发器(意思是由同一个更新触发器在表中进行的更新触发的更新触发器),您可以使用以下命令禁用递归触发器alter database
:
ALTER DATABASE MyDataBase SET RECURSIVE_TRIGGERS OFF;
GO
您还可以将触发器嵌套级别设置为 0 以禁用直接和间接触发器递归,但我建议谨慎使用此步骤 - 特别是如果您使用触发器来强制执行业务规则。
EXEC sp_configure 'nested triggers', 0 ;
GO
RECONFIGURE;
GO
推荐阅读
- angular - Angular 10 NgForm
- css - SVG 动画 - 来自中心的 SVG 的 CSS 悬停动画
- node.js - 子域基础数据库连接(nodejs + express)
- android - ViewModel 单元测试 - 使用延迟
- c# - c# 能够使用流,即使在更改保存它的变量之后
- azure-devops - 我在 Azure DevOps 中的构建管道每次推送运行两次
- python - 捕获特定关键字之间的行并打印输出
- c++ - STL 是否提供了一些东西来查找由两个非反向迭代器定义的范围内谓词为真的最后一个元素?
- openlayers-6 - 找出所有已成功加载到图层的要素的事件
- arrays - 如何使用用户定义的索引值在飞镖中创建一个列表?