Я пишу вместо триггера для обновлений, который выполняет некоторый аудит и затем должен выполнять фактическое обновление только при изменении любого столбца, кроме двух. У меня есть запрос, который делает это, но проблема заключается в обслуживании. Запрос должен перечислять каждый столбец в таблице несколько раз, и эта таблица (и некоторые другие подобные) могут измениться. Это накладывает очень большую нагрузку на программиста каждый раз, когда вносятся какие-либо изменения. Вот как выглядит запрос:
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
?» Если бы это было так, мне больше никогда бы не пришлось смотреть на эти запросы.