gpt4 book ai didi

sql-server - 同一个表的两个不同的更新触发器

转载 作者:行者123 更新时间:2023-12-02 15:34:52 25 4
gpt4 key购买 nike

如何防止在同一个表上的同一事件触发的两个触发器之间出现锁定问题?

我正在处理的数据库已经有一个加密的更新触发器,因此我无法修改它。我制作了另一个更新触发器来完成一些新任务,当我直接在数据库上测试它时它可以正常工作,但当我在前端应用程序上对产品进行更新时它会失败。显然,当我激活触发器时,两个触发器都会失败。我收到的消息类似于“文档已打开,我将增加它的值”。

这是一个锁定问题吗?

有一个related question有人说我们可以在一张 table 上有多个触发器(针对同一事件)。

这是我的触发器代码:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER [dbo].[tr_st_rep_update]
ON [dbo].[st]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;

IF ( update(ref)
OR update(design)
OR update(u_update)
OR update(u_ativo)
OR update(stock)
OR update(epv1)
OR update(epv2)
OR update(epv3)
OR update(peso)
OR update(u_catnv1)
OR update(u_catnv2)
OR update(u_catnv3)
OR update(u_dpromoi)
OR update(u_dpromof)
OR update(u_destaque) )
BEGIN
IF (SELECT count(*)
FROM Inserted
INNER JOIN Deleted
ON Inserted.ststamp = Deleted.ststamp
WHERE inserted.u_ativo = 1
OR ( Deleted.u_ativo = 1
AND Inserted.u_ativo = 0 )) > 0
BEGIN
INSERT INTO RepData
(id,
REF,
familia,
stock,
epv1,
epv2,
epv3,
peso,
u_accao,
imagem,
process)
SELECT Inserted.ststamp AS id,
Inserted.REF AS REF,
Inserted.familia AS familia,
Inserted.stock AS stock,
Inserted.epv1 AS epv1,
Inserted.epv2 AS epv2,
Inserted.epv3 AS epv3,
Inserted.peso AS peso,
CASE
WHEN Deleted.u_ativo = 1
AND Inserted.u_ativo = 0 THEN 'd'
ELSE 'u'
END AS u_accao,
Inserted.imagem AS imagem,
0 AS process
FROM Inserted
INNER JOIN Deleted
ON Deleted.ststamp = Inserted.ststamp
WHERE inserted.u_ativo = 1
OR ( Deleted.u_ativo = 1
AND Inserted.u_ativo = 0 )
END
END
END

如有任何帮助,我们将不胜感激。

更新:数据库是MSSQL 2008

最佳答案

使用触发器进行部署后现场开发和自定义是一个诱人的想法,但从一开始就是个坏主意,并且无疑会不断地为您产生此类问题。

但是,考虑到这一点,那么首先:表可以有多个触发器,这不是问题。

其次,错误消息“文档已打开,我将增加它的值”来自您的客户端应用程序或其他(加密的)触发器,它不是 SQL Server 错误消息。鉴于此,您可能可以尝试将加密触发器设置为首先执行,或将触发器设置为最后执行。这可能无法解决问题,但它可能将错误从加密触发器转移到您的触发器中,您可以更好地以可管理的方式报告和/或解决它。

虽然是临时性的,但唯一可以看出可能来自您的触发器的问题是,如果另一个触发器也在写入 RepData 表,并且您的双重写入会导致重复的键违规。

<小时/>

触发顺序可以通过sp_settriggerorder系统过程控制,该过程记录在here中。 .

关于sql-server - 同一个表的两个不同的更新触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14403649/

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