我的触发器永远在运行?知道为什么吗?

时间:2011-08-01 19:34:23

标签: sql-server tsql triggers

我创建了以下TSQL触发器,只要底层表更新,它就会永远运行。

CREATE TRIGGER Trigger_MDSS_ComputeAggregates
ON dbo.MonthlyDetectionScoresSums
AFTER UPDATE, INSERT
AS
BEGIN


update dbo.MonthlyDetectionScoresSums
SET
YPElec = CAST(COALESCE (i.YPLocChain_TotElec, i.YPGlobChain_TotElec, i.YPSIC_TotElec) AS real),
YPGas = CAST(COALESCE (i.YPLocChain_TotGas, i.YPSIC_TotGas) AS real)
from MonthlyDetectionScoresSums mdss
inner join INSERTED i on i.ACI_OI = mdss.ACI_OI

END
GO

你知道为什么它可能会运行很长时间吗?

2 个答案:

答案 0 :(得分:5)

我可以建议你使用computed columns并放下触发器吗?

ALTER TABLE dbo.MonthlyDetectionScoresSums ADD
    YPElec AS CAST(COALESCE (YPLocChain_TotElec, YPGlobChain_TotElec, YPSIC_TotElec) AS real)
    YPGas AS CAST(COALESCE (YPLocChain_TotGas, YPSIC_TotGas) AS real)

从我看到的,您正在更新刚刚更新/插入的行。数据库引擎将为您完成,无需触发器。

答案 1 :(得分:2)

您是否启用了递归触发器?

虽然应该终止无限循环,但是如果您的更新非常大,可能需要很长时间才能达到32的嵌套限制:

http://msdn.microsoft.com/en-us/library/ms190739.aspx