TSQL:如果除2列以外的任何列发生更改而不枚举列,则更新

TSQL:如果除2列以外的任何列发生更改而不枚举列,则更新,sql,triggers,sql-update,Sql,Triggers,Sql Update,我正在为更新编写一个instead of触发器,该触发器执行一些审核,然后只在任何列发生更改时执行实际更新,两列除外。我有一个这样做的查询,但问题是维护。查询必须多次列出表中的每一列,并且此表(以及其他类似的表)可能会发生更改。每次进行任何更改时,这都会给程序员带来很大的负担。以下是查询的外观: create trigger member_history_trigger on Member instead of update as begin insert into MemberHistory

我正在为更新编写一个instead of触发器,该触发器执行一些审核,然后只在任何列发生更改时执行实际更新,两列除外。我有一个这样做的查询,但问题是维护。查询必须多次列出表中的每一列,并且此表(以及其他类似的表)可能会发生更改。每次进行任何更改时,这都会给程序员带来很大的负担。以下是查询的外观:

create trigger member_history_trigger on Member
instead of update
as
begin

insert into MemberHistory (Name, Address, RevisedBy, RevisedDate)
select d.Name, d.Address, d.RevisedBy, d.RevisedDate
from DELETED d 
join INSERTED i on (d.memberid = i.memberid)
where (d.Name != i.Name or d.Address != i.Address);


update m
set   m.Name = i.Name
    , m.Address = i.Address
    , m.RevisedBy = i.RevisedBy
    , m.RevisedDate = i.RevisedDate
from INSERTED i left join Member m on (i.MemberID = m.MemberID)
where (m.Name != i.Name or m.Address != i.Address)

end
正如您在上面看到的,我只想在
RevisedBy
RevisedOn
以外的字段更改时执行更新。这个例子看起来很简单,但实际上这个表有20个字段,还有10个类似的表,必须对它们执行相同的操作

我可以做同样的事情,但不列出每列的名称吗?有没有一种方法可以说,“如果任何列发生了更改,而不是
RevisedBy
RevisedDate
”?如果有,我就再也不用查看这些查询了。

没有。

通常,由于很好的原因,例如表结构更改的能力(以及频繁发生的情况),很难在不显式的情况下指示字段

我不知道有哪种方法可以在不使用动态SQL(触发器内部非常危险和可怕)或显式列出列的情况下指定列的子集


这是一种痛苦,但它是一种正确的做法,可以防止各种意外后果。

我曾考虑在触发器中建议使用动态SQL,但它从来都不是一种好的做法,是吗?是的,我相当肯定会是这样,但我还是一个新手,希望一些SQL专家能从天而降,将我的问题的解决方案带到他的双臂上。