2014-01-06 78 views
2

我知道您可以爲列設置一個timestamp/rowversion類型。表「時間戳」?

是否有類似的屬性/字段/機制的表,它可以告訴我,如果錶行被修改(例如行/插入/刪除/更新)?

我可以讀取表模式,但我看不到任何顯示此類信息的列(例如,如果我使用ADO打開表模式 - DATE_MODIFIED始終爲空 - 我也確定它引用表結構,而不是行數據)。

我想創建我自己的「應用程序」表,我將存儲這些信息,這些信息將通過在我需要檢查的表中創建觸發器來收集。但是,如果這個問題已經存在一個工作模式,這似乎是一個很大的努力。

謝謝。

+0

查看http://stackoverflow.com/questions/1227707/how-to-get-last-insert-update-delete-datetime-on-sql-server-2005? – cubitouch

+2

您不設置時間戳記值。 Sql Server設置它。舉個例子來看這篇文章的答案。 http://stackoverflow.com/questions/17116334/sql-server-2008-row-insert-and-update-timestamps – granadaCoder

+0

@granadaCoder,是的,對不起,我使用了錯誤的術語。 – ZigiZ

回答

3

對於沒有適用於表的timestamp/rowversion是正確的。

您可以根據您的建議創建修改表。您可以使用觸發器捕獲任何INSERT/UPDATE/DELETE語句並插入修改的日期/時間。但是,這個日期/時間並不告訴你什麼改變 - 只有東西改變。這個限制對你來說可能是可接受的。

如果您需要了解有關更改內容的更多信息,可以在每條記錄上使用timestamp或修改日期列。讓應用程序代碼記錄最近已知的最大時間戳或更改日期。然後查詢更改的記錄變得很容易。這也應該不需要單獨的表來追蹤修改日期。

不幸的是,你不能確切地告訴哪些行以這種方式被刪除。如果您還需要跟蹤已刪除的行,則可能需要使用觸發器將它們記錄在表中。

- 編輯 -

微軟增加change tracking and change data capture開始與SQL Server 2008中我從來沒有使用過這個功能,所以我有一個關於它沒有建議。但是,該功能可在SQL Server Standard Edition中找到,因此您無需購買企業版即可獲得該功能。

要使用更改跟蹤,首先配置要使用的數據庫更改跟蹤:

ALTER DATABASE MyDatabase SET CHANGE_TRACKING = ON (CHANGE_RETENTION = 14 DAYS) 

下一步,配置要跟蹤哪些表:

ALTER TABLE MyTable ENABLE CHANGE_TRACKING WITH (TRACK_COLUMNS_UPDATED = ON) 

要獲得最新版本,使用CHANGE_TRACKING_CURRENT_VERSION

DECLARE @version BIGINT 
SET @version = CHANGE_TRACKING_CURRENT_VERSION(); 

SELECT * FROM MyTable 

要獲取自上次版本以來的更改,使用CHANGETABLE function。使用LEFT JOIN確保查詢返回刪除的行信息:

SELECT * 
FROM CHANGETABLE(CHANGES MyTable, @version) C 
LEFT JOIN MyTable T 
    ON T.ID = C.ID 

注意,微軟建議使用快照隔離:

選擇將使用更改跟蹤的應用程序時,你是 工作方法(或任何自定義跟蹤機制),需要進行重要分析。因此,使用快照 隔離要簡單得多。