gpt4 book ai didi

sql-server - SQL 服务器 : option to specify if Update Transaction was from trigger?

转载 作者:行者123 更新时间:2023-12-01 13:36:06 25 4
gpt4 key购买 nike

第一次发帖,请温柔点...

我需要在更新表或插入行时更新一列,因此我创建了一个触发器(AFTER INSERT, UPDATE)。问题在于它是递归的,因为插入包含更新语句,因此再次触发触发器。

我也曾尝试将 INSERTUPDATE 分成两个不同的触发器,但我遇到了 sp_settriggerorder() 的问题和 trigger_neSTLevel(),因为由于开箱即用的应用程序默认设置,还有其他触发器就位。

我的问题是,有什么方法可以使用 IF 子句来说明更新是来自应用程序本身还是我的触发器?案例,如果它是我的触发器,那么我可以很容易地 ELSE IF 它返回并且它不再是递归的。

CREATE TRIGGER [dbo].[JobCardMetlInsertUpdateItemDesc]
ON [dbo].[JobCardMetl] AFTER INSERT
AS
BEGIN TRANSACTION [Description]

UPDATE JobCardMetl
SET JobCardMetl.Description = item.Description
FROM JobCardMetl
INNER JOIN item ON JobCardMetl.Item = item.item
WHERE JobCardMetl.RecordDate = (SELECT MAX(JobCardMetl.RecordDate)
FROM JobCardMetl)

COMMIT TRANSACTION [Description]

最佳答案

您的触发器非常可疑:它没有引用INSERTED 伪表。这意味着您的触发器正在更新不受 INSERT 影响的记录,这总是一个巨大的代码味道。

递归触发器问题的通常解决方案是注意正在更新的列,即。使用 UPDATED() ,以及哪些行,以及自然的业务逻辑应该停止递归(即嵌套触发器应该找不到任何要更新的东西,因为保护检查不合格)。

最终你可以使用逻辑大锤:SET CONTEXT_INFOCONTEXT_INFO() .你检查它,设置它并在你的触发器中清理它。如果已设置,则您知道您是从触发器嵌套的。清理部分很关键。您还祈祷没有其他应用程序/开发人员做同样的事情,因为每个 session 只有一个上下文信息(SQL 2016 改进了这一点)。

关于sql-server - SQL 服务器 : option to specify if Update Transaction was from trigger?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43239650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com