0
我正在編寫一個代替觸發器的更新來執行某些審計,然後只應在任何列更改時執行實際更新(除兩個之外)。我有一個這樣做的查詢,但問題是維護。查詢必須多次列出表中的每一列,並且此表(以及其他幾個類似的表)可能會更改。每次進行任何更改時,這都會給程序員帶來很大的負擔。下面是該查詢的樣子:TSQL:更新如果有2列沒有枚舉列時發生更改
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,但它確實從來沒有,一種很好的做法,是嗎? – 2012-04-02 21:06:53
是的,我相當肯定會是這樣,但我還是比較新的,希望有一些SQL Guru會從天而降,並且帶着他的多臂解決我的問題。 – mtmurdock 2012-04-02 21:43:27