Sql server T-SQL查询可以手动工作,但不能在触发器中工作

Sql server T-SQL查询可以手动工作,但不能在触发器中工作,sql-server,tsql,triggers,Sql Server,Tsql,Triggers,我在数据库上有一个触发器,用于强制执行业务规则:当某个事件发生时,其中一个表上的标志将更新。我知道这不是建议使用的触发器,更好的做法是在数据库之外,在生成事件的代码中强制执行此规则。但由于超出我控制范围的原因,这是不可能的,并且此标志的维护由数据库负责 因此,我设计了适当的查询来维护这个标志。查询如下所示: UPDATE flg_tbl SET flag = 'T' FROM flag_table AS flg_tbl INNER JOIN table1 AS tbl1 ON tbl1.id =

我在数据库上有一个触发器,用于强制执行业务规则:当某个事件发生时,其中一个表上的标志将更新。我知道这不是建议使用的触发器,更好的做法是在数据库之外,在生成事件的代码中强制执行此规则。但由于超出我控制范围的原因,这是不可能的,并且此标志的维护由数据库负责

因此,我设计了适当的查询来维护这个标志。查询如下所示:

UPDATE flg_tbl
SET flag = 'T'
FROM flag_table AS flg_tbl
INNER JOIN table1 AS tbl1 ON tbl1.id = flg_tbl.id
INNER JOIN table2 AS tbl2 ON tbl2.id = flg_tbl.id
...
WHERE tbl2.id IN (SELECT id FROM inserted)
当我手动运行这个查询时,一切都很好。但作为一个触发器,什么都不会发生

此触发器将在一系列表插入后执行,这些插入会影响查询中的所有内部联接表。我将触发器作为插入后触发器放在表列表中更新的最后一个表上,但它仍然不起作用。我觉得在这一系列插入中执行的是罪魁祸首;可能所有的表都还没有提交,触发器使用的是旧数据,尽管已经触发了

有没有办法将触发器延迟到提交整个事务之后?还是等到承诺了我才明白真正的原因

查询X的完整、模糊版本是要更新的表,I是触发器所在的表:

UPDATE X
SET X.flag = 'T'
FROM tableA AS A
INNER JOIN tableB AS B ON A.id = B.id
INNER JOIN tableX AS X ON X.otherrow = B.otherrow
INNER JOIN tableA AS A2 ON A.diffrow = A2.diffrow AND X.id = A2.id
INNER JOIN tableC AS C ON B.id = C.id AND C.otherflag = 'A'
INNER JOIN tableI AS I ON I.id = B.id
WHERE I.id IN (SELECT id FROM inserted)

引用带有触发器的表似乎没有必要,因为它的行是插入的。以下内容似乎是等效的,可以避免问题:

UPDATE X
SET X.flag = 'T'
FROM tableA AS A
INNER JOIN tableB AS B ON A.id = B.id
INNER JOIN tableX AS X ON X.otherrow = B.otherrow
INNER JOIN tableA AS A2 ON A.diffrow = A2.diffrow AND X.id = A2.id
INNER JOIN tableC AS C ON B.id = C.id AND C.otherflag = 'A'
WHERE B.id IN (SELECT id FROM inserted)


如何手动运行此操作?inserted不存在于触发器的作用域之外。您将触发器放在了哪些表上?@AaronBertrand我将inserted中的SELECT id替换为插入的id。@hatchet我将触发器放在一个内部联接表上。其中有5个,我把触发器放在最后一个被外部代码插入的表上。@Klazen108-所以一个特定的id值在所有这些表中都有一个条目,在每个表中都有一个名为id的列?如果仅更新flg_tbl时所有内部联接都在flg_tbl.id上联接,那么它们的用途是什么?我的怀疑是id列在连接中被混淆了,和/或WHERE子句总是返回false。就是这样,它现在可以工作了!我猜通过引用触发器中的tableI,它使用了旧数据,但失败了。我真的很感谢你的帮助!
UPDATE X
SET X.flag = 'T'
FROM tableX AS X
INNER JOIN tableB AS B ON X.otherrow = B.otherrow
INNER JOIN tableA AS A ON A.id = B.id
INNER JOIN tableA AS A2 ON A.diffrow = A2.diffrow AND X.id = A2.id
INNER JOIN tableC AS C ON B.id = C.id AND C.otherflag = 'A'
WHERE B.id IN (SELECT id FROM inserted)