Sql 无限循环触发器
我在表x上有一个更新/插入后触发器。在这个触发器中,我需要检查某个列是否已更新,这对于执行删除/插入表比较来说足够简单。但是,如果某列已更改为某个值,则需要更新表x中插入的行。这样做显然会创建一个循环。问题是我没有任何运气在触发器开始时捕获循环 下面是我使用的SQL,为糟糕的临时表名道歉Sql 无限循环触发器,sql,tsql,loops,triggers,Sql,Tsql,Loops,Triggers,我在表x上有一个更新/插入后触发器。在这个触发器中,我需要检查某个列是否已更新,这对于执行删除/插入表比较来说足够简单。但是,如果某列已更改为某个值,则需要更新表x中插入的行。这样做显然会创建一个循环。问题是我没有任何运气在触发器开始时捕获循环 下面是我使用的SQL,为糟糕的临时表名道歉 FOR INSERT, UPDATE AS BEGIN SELECT i1.wo_id, i1.wo_status, i1.wo_link_type, i1
FOR INSERT, UPDATE
AS
BEGIN
SELECT i1.wo_id,
i1.wo_status,
i1.wo_link_type,
i1.wo_link
INTO #x_MLN16901
FROM inserted AS i1
WHERE i1.wo_status = 7
DELETE
FROM #x_MLN16901
WHERE #x_MLN16901.wo_id IN
(
SELECT d1.wo_id
FROM deleted AS d1
WHERE d1.wo_status <> 7 OR
d1.wo_link_type <> 'PM'
) OR
#x_MLN16901.wo_id IN
(
SELECT i2.wo_id
FROM inserted AS i2
WHERE i2.wo_link_type <> 'PM'
)
IF (SELECT COUNT(*) FROM #x_MLN16901) = 0
RETURN
UPDATE workorders
SET workorders.wo_action_date = GETDATE()
WHERE workorders.wo_id IN
(
SELECT wo_id
FROM #x_MLN16901
)
我知道最后一条update语句是cuplrit,但我想不出有什么不同的方法,或者在触发器开始时捕获循环的最佳方法
我正在考虑使用一个全局临时表,并在触发器开始时检查插入的记录集,如果全局临时表中已经存在行,则退出触发器。我的同事们向我保证,这可能会使事情变得过于复杂,一个简单的答案要么不起作用,要么存在一个更简单的答案
非常感谢您的帮助。
Tommy在更新导致初始触发器的主表上的值之前,能否关闭recursice触发器 我相信你能
请看一下在辅助触发器上执行此操作。由于您仅引用表wo\U status、wo\U link\U type和wo\U link中的三个字段,因此我假设您只需要在其中一个被更新时触发此触发器。因此,更改触发器的更新部分,使其仅在更新这些特定字段时触发。由于您上次的更新没有更改其中任何一项,因此这将删除递归 语法用于更新。。。。见甲骨文