TSQL: обновить, если есть изменения, кроме двух, без нумерации столбцов. - PullRequest
0 голосов
/ 02 апреля 2012

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

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?» Если бы это было так, мне больше никогда бы не пришлось смотреть на эти запросы.

1 Ответ

1 голос
/ 03 апреля 2012

Нет.

Как правило, трудно указывать поля без явного указания по очень веским причинам, таким как способность (и частое появление) изменений структуры таблицы.

Мне неизвестен какой-либо метод указания подмножества столбцов без использования динамического SQL (опасного и пугающего внутри триггера) или явного перечисления их.

Это боль, но это правильная практика, которая предотвратит любые неожиданные последствия.

...