数据库在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
答案 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)而错过你想要更新的行,你一直在使用集合并且不会得到任何讨厌的错误或某些)。
如果您的问题出现死锁,这对您无济于事。