2013-11-20 57 views
0

我使用這個腳本目前加入觸發所有數據庫中的表:添加到所有表數據庫

exec sp_MSForEachTable 'CREATE TRIGGER [?_Update] ON ? FOR UPDATE AS 
BEGIN SET NOCOUNT ON update ? set ModifiedOn = GETDATE() END' 

我需要改變的觸發,使其只更新更改的行等等它必須看起來像這樣:

exec sp_MSForEachTable 'CREATE TRIGGER [?_Update] ON ? FOR UPDATE AS 
BEGIN SET NOCOUNT ON update ? set ModifiedOn = GETDATE() 
from ? updatedTable inner join inserted i 
on i.[the tables primary key] = updatedTable.[the tables primary key] 
END' 

但我不知道如何讓[表的主鍵]值。由第一腳本創建的觸發器的樣子:

update [dim].[company] set ModifiedOn = GETDATE() 

,並假設我能得到第二腳本工作,將創建該觸發器:

update [dim].[company] set ModifiedOn = GETDATE() 
from [Dim].[Company] updatedTable 
inner join inserted i on i.CompanyKey = updatedTable.CompanyKey 

有誰知道如何做到這一點,或者如果它不可能將所需的觸發器添加到數據庫中的所有表的替代方法?

最終目標是要知道記錄何時更改,最好是人類可讀或可以轉換爲人類可讀的記錄。我不知道更新將來自何時何地,因此使用sprocs進行更新已經結束。

+0

使用插入的關鍵字引用正在更改的記錄。 http://technet.microsoft.com/en-us/library/aa214435(v=sql.80).aspx – xQbert

+0

我已經發布了一個答案,如果你所有的PK都是IDENTITY列,那麼這個答案將會起作用。如果不是這樣,那麼它開始變得非常快 - 你需要一個額外的元數據查詢,所以你可能不希望再使用'sp_MSforeachtable',組合PK將會使它更加醜陋。 –

回答

0

如果所有的主鍵,具體而言,標識列,那麼你可以欺騙和使用IDENTITYCOL「列」的名字:

create table T (ID int IDENTITY(1,1) not null primary key,Col1 varchar(10) not null,Changed datetime null) 
go 

create trigger T_T 
on T 
after insert,update 
as 
    update t set Changed = GETDATE() 
    from inserted i 
     inner join 
     T t on i.IDENTITYCOL = t.IDENTITYCOL 

IDENTITYCOL實際上是出於某種列是一個自動別名該表中的標識列。


事實上,$身份可能是首選:

update t set Changed = GETDATE() 
from inserted i 
    inner join 
    T t on i.$identity = t.$identity 

它將出現在IDENTITYCOLdeprecated。並不是說我實際上可以找到其中任何一個的實際文檔頁面。