Sql server 而不是更新触发器执行它正在替换的标准更新

Sql server 而不是更新触发器执行它正在替换的标准更新,sql-server,triggers,sql-server-2008-r2,Sql Server,Triggers,Sql Server 2008 R2,这似乎是一个非常愚蠢的问题,但我在网上找不到任何关于如何做到这一点的信息 如果您正在设计一个将包装更新操作的触发器,那么您实际上是如何执行该操作的?我是否必须明确提到tbl_MyTable中的每一列才能执行更新?对于将来可能发生的模式更改,这似乎需要大量维护,我不想在启用递归时不必要地点击Insert或Delete触发器 CREATE TRIGGER [dbo].[tr_MyUpdateTrigger] ON [dbo].[tbl_MyTable] INSTEAD OF UPDATE AS BE

这似乎是一个非常愚蠢的问题,但我在网上找不到任何关于如何做到这一点的信息

如果您正在设计一个将包装更新操作的触发器,那么您实际上是如何执行该操作的?我是否必须明确提到
tbl_MyTable
中的每一列才能执行更新?对于将来可能发生的模式更改,这似乎需要大量维护,我不想在启用递归时不必要地点击
Insert
Delete
触发器

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

简言之,如何在不使用delete from deleted和inserted from inserted或显式提及表中的每一列的情况下完成更新。这可能吗

因为您使用的是一个而不是一个,所以您必须进行更新-不能绕过它。如果要使用AFTER触发器,则根本不需要进行更新。您应该使用哪种类型的触发器取决于您试图实现的目标

不过,为了澄清一件事,您不会从“已删除”伪表中删除数据,然后插入到“已插入”伪表中。您对实表进行更新,并在适当的键上连接到“插入的”伪表以获取新值

如果我必须这样做,我可能会想用这样的东西来节省我打字的时间:)


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

如果有人更新主键,inserted将没有任何连接,因此我认为您必须根据删除的psudo从实际表中删除,并根据插入的psudo进行插入。但由于递归的原因,我并不特别想这么做。这一点很好!然而,我认为这更多的是一个设计问题——在允许主键更新方面还有很多其他问题。你可以使用这个函数来测试主键列是否已经更新,并拒绝更新。啊,对了,所以我可以将PK的更新视为删除+插入,这是有意义的。对于所有不涉及PK更新的内容,只需根据插入的。。。这是否还涉及到明确提到tbl_MyTable中的每一列?@Izzy-yup,每一列,尽管如果必须这样做,我可能会尝试使用类似于
select N't的东西,“+quotename(name)+N'=I.“+quotename(name)+N'”,“[SQL]作为sys.columns,其中object_id=object_id('dbo.MyTable'))按列排序\u id
省得我输入太多:)诅咒!如果你把这个提示编辑成你的答案,我会接受的。:)
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