同じテーブルの同じイベントで発生する2つのトリガ間のロックの問題を防ぐにはどうすればよいですか?同じテーブルの2つの異なる更新トリガ
私が作業しているDBにはすでに暗号化されている更新トリガが1つありますので、変更できません。新しいタスクを達成するために別の更新トリガーを作成しました。データベースで直接テストすると正しく動作しますが、フロントエンドアプリケーションで製品を更新すると失敗します。明らかに、私のトリガーをアクティブにしても、両方のトリガーは失敗します。私が受け取るメッセージは、「文書はすでに開いています。私はそれを増やします」というものです。
これはロックの問題ですか?
テーブル上に複数のトリガー(同じイベントの場合)があると、誰かが言うところの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