调用SQL触发器后,外部服务检测到故障

时间:2017-03-10 05:23:02

标签: sql triggers

数据库在SQL 2008R2上运行。

外部服务正在更新SVCLog表。

当记录特定消息时,我想更新不同表中的值。当我的触发器运行时,服务检测到插入SVC-Log时失败并尝试再次插入数据。即使触发器已成功执行。

触发码是:

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

1 个答案:

答案 0 :(得分:0)

至少有一个主要问题是,如果有人插入多行,或者某人插入了与您要比较值的表格中的多行匹配的行,则触发器不起作用。你可以像这样重构它:

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

这样,当你尝试将多个结果分配给标量变量时(或者因为你做了{{1)而错过你想要更新的行,你一直在使用集合并且不会得到任何讨厌的错误或某些)。

如果您的问题出现死锁,这对您无济于事。