2017-03-10 4 views
0

SQL 2008R2でデータベースが実行されています。SQLトリガーが呼び出された後、外部サービスが障害を検出します

外部サービスがSVCLogテーブルを更新しています。

特定のメッセージが記録されているときに、別のテーブルの値を更新したいとします。私のトリガが実行されると、サービスはSVC-Logへの挿入が失敗したことを検出し、2回目にデータを挿入しようとします。トリガーが正常に実行されたにもかかわらず。

トリガ・コードは次のとおりです。

ALTER TRIGGER [dbo].[UpdateIndex6] on [dbo].[SVCLog] FOR INSERT AS BEGIN 
IF exists (SELECT '*' FROM INSERTED WHERE (INSERTED.LogEntry LIKE '%Work Item % Created')) 

Begin 
DECLARE @WorkID INT 
DECLARE @ProcessID INT 
DECLARE @ProcessDescription NVARCHAR(100) 

SELECT @WorkID = WorkID from inserted 
SELECT @processid = ProcessId from WorkManagement where WorkID = @WorkID 
SELECT @ProcessDescription = ProcessDescription from ActiveProcesses where ProcessID = @ProcessID 

IF @ProcessDescription like '%Falkland%' 
UPDATE WorkManagment SET Index6 = 'Falkland' WHERE WorkID = @WorkID; 

IF @ProcessDescription like '%Canada%' 
UPDATE WorkManagment SET Index6 = 'Canada' WHERE WorkID = @WorkID; 

END 
END 
GO 

答えて

0

あなたは、誰かが複数の行を挿入、または誰かが1行を挿入した場合に1以上に一致する場合は、あなたのトリガが機能しないことに少なくとも1つの大きな問題を抱えています値を比較している表の行。あなたはこのようにそれをリファクタリングできます

ALTER TRIGGER [dbo].[UpdateIndex6] on [dbo].[SVCLog] FOR INSERT AS BEGIN 
IF exists (SELECT * FROM INSERTED WHERE (INSERTED.LogEntry LIKE '%Work Item % Created')) 

Begin 


UPDATE wm 
SET Index6 = CASE WHEN ap.ProcessDescription LIKE '%Canada%' THEN 'Canada' 
        WHEN ap.ProcessDescription LIKE '%Falkland%' THEN 'Falkland' 
        ELSE Index6 END 
FROM WorkManagement wm 
INNER JOIN ActiveProcesses ap 
ON ap.ProcessID = wm.ProcessID 
INNER JOIN inserted i 
ON wm.WorkID = i.WorkID 

END 
END 
GO 

そのように、あなたはを通してセットですべての方法を作業しているし、あなたがスカラー変数(またはミス行に複数の結果を代入しようとすると、任意の厄介なエラーを取得することはありませんTOP 1などを行ったために更新したいと考えていました)。

問題がデッドロックしても、これは役に立ちません。

関連する問題