2012-04-02 23 views
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 

正如你可以在上面看到,我只想要執行更新操作時比RevisedByRevisedOn變化的其他領域。這個例子看起來很簡單,但實際上這個表格有20個字段,還有10個其他的表格,爲此它必須完成。

我可以做同樣的事情,但不列出每列的名稱?有沒有辦法說:「如果任何列的更改不是RevisedByRevisedDate?如果有的話,我再也不用再看這些問題了。

回答

1

沒有。

通常,由於非常好的原因(例如表格結構變化的能力(和頻繁出現)),很難指出字段而不明確。

我不知道任何指定列的子集而不使用動態SQL(危險的,在觸發器內部徹底恐怖)或明確列出它們的方法。

這是一個痛苦,但這是一個適當的做法,並會防止各種意想不到的後果。

+0

我正在考慮在觸發器中建議動態SQL,但它確實從來沒有,一種很好的做法,是嗎? – 2012-04-02 21:06:53

+0

是的,我相當肯定會是這樣,但我還是比較新的,希望有一些SQL Guru會從天而降,並且帶着他的多臂解決我的問題。 – mtmurdock 2012-04-02 21:43:27