INSTEAD OF UPDATE 触发器执行它正在替换的标准更新

INSTEAD OF UPDATE triggers doing the standard update it was replacing

这似乎是一个非常愚蠢的问题,但我在网上找不到任何有关如何执行此操作的信息。

如果您正在设计一个将包装更新操作的触发器,您实际上是如何执行该操作的?我是否必须明确提及 tbl_MyTable 中的每一列才能执行更新?对于未来潜在的架构更改,这似乎需要大量维护,而且我不想在启用递归时不必要地点击 InsertDelete 触发器。

CREATE TRIGGER [dbo].[tr_MyUpdateTrigger]
ON [dbo].[tbl_MyTable]
INSTEAD OF UPDATE
AS
BEGIN
--Do the standard update operation on tbl_MyTable that this trigger is replacing
END

简而言之,如何在不诉诸从删除中删除和从插入中插入,或者明确提及 table 中的每一列的情况下完成更新。这可能吗?

因为您使用的是 INSTEAD OF trigger,所以您必须执行更新 - 无法绕过它。如果您要使用 AFTER 触发器,那么您根本不需要执行 UPDATE。您应该使用哪种类型的触发器取决于您要实现的目标。

只是为了澄清一件事,您不会从 'deleted' 伪 table 中删除并插入 'inserted' 伪 table。您在真实 table 上执行更新,并在适当的键上加入 'inserted' 伪 table 以获取新值。

如果我必须这样做,我可能会想使用这样的东西来避免我打太多字 :)

select N't.' + quotename(name) + N' = i.' + quotename(name) + N', ' as [--SQL] 
from sys.columns 
where object_id = object_id('dbo.MyTable') 
order by column_id 

不要忘记从生成的列表中删除 PK 列和任何其他不合适的列(即时间戳)。