對於沒有適用於表的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
注意,微軟建議使用快照隔離:
選擇將使用更改跟蹤的應用程序時,你是 工作方法(或任何自定義跟蹤機制),需要進行重要分析。因此,使用快照 隔離要簡單得多。
查看http://stackoverflow.com/questions/1227707/how-to-get-last-insert-update-delete-datetime-on-sql-server-2005? – cubitouch
您不設置時間戳記值。 Sql Server設置它。舉個例子來看這篇文章的答案。 http://stackoverflow.com/questions/17116334/sql-server-2008-row-insert-and-update-timestamps – granadaCoder
@granadaCoder,是的,對不起,我使用了錯誤的術語。 – ZigiZ