如何防止在同一个表上的同一事件触发的两个触发器之间的锁定问题?同一个表的两个不同的更新触发器
我正在使用的数据库已经有一个更新触发器被加密,因此我无法修改它。我做了另一个更新触发器来完成一些新的任务,当我直接在数据库上测试它时,它正常工作,但是当我对前端应用程序中的产品进行更新时失败。显然,当我有我的触发器激活两个触发器失败。我得到的消息是类似于“文档已经打开,我会增加它的价值”。
这是锁定问题吗?
有一个related question有人说我们可以在一张桌子上有多个触发器(对于同一个事件)。
这里是我的触发代码:
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错误消息。 –
我没有得到任何其他信息,它甚至没有显示为错误,而是信息消息。如果相关,操作是产品库存更新。 – Fabio
如果它的生产,检查应用程序日志,它必须写在某个地方,如果不运行分析器上的分析器,看看发生了什么 – WKordos