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

我在表x上有一个更新/插入后触发器。在这个触发器中,我需要检查某个列是否已更新,这对于执行删除/插入表比较来说足够简单。但是,如果某列已更改为某个值,则需要更新表x中插入的行。这样做显然会创建一个循环。问题是我没有任何运气在触发器开始时捕获循环

下面是我使用的SQL,为糟糕的临时表名道歉

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中的三个字段,因此我假设您只需要在其中一个被更新时触发此触发器。因此,更改触发器的更新部分,使其仅在更新这些特定字段时触发。由于您上次的更新没有更改其中任何一项,因此这将删除递归

语法用于更新。。。。见甲骨文