2013-05-17 45 views
7

我有sql server 2008數據庫,我想知道上週哪些表已更新,即具有新行,已更新現有行或哪些行被刪除的表。如何列出插入數據的表格上週刪除或更新了

有沒有辦法爲現有的數據庫做到這一點。

+0

的跟蹤數據更改(SQL Server)的對於SQL Server 2008 ... HTTP://msdn.microsoft.com/en-us/library/bb933994 %28v = sql.100%29.aspx – wcraft

+3

[比較更改數據捕獲和更改跟蹤](http://msdn.microsoft.com/en-us/library/cc280519(v = sql.100).aspx)。 –

回答

3

嘗試使用Change Data Capture。跟蹤您在數據庫中的更改是一種好方法。您必須在一個或多個數據庫上啓用該功能,然後在一個或多個表上啓用該功能(這是一個表格功能,因此您需要爲每個需要的表執行此功能)。


數據庫啓用CDC。

讓我們假設我們要啓用CDC for AdventureWorks數據庫。我們必須運行下面的SP,以確保此功能將工作:

USE AdventureWorks 
GO 
EXEC sys.sp_cdc_enable_db 
GO 

至於結果,我們會發現一個名爲CDC和幾個表自動添加新的模式:

  • CDC。 captured_columns - 此表格返回捕獲列的列表結果。
  • cdc.change_tables - 此表返回所有啓用捕獲的表的列表。
  • cdc.ddl_history - 此表包含自啓用捕獲數據後所有DDL更改的歷史記錄。
  • cdc.index_columns - 此表包含與變更表相關的索引。
  • cdc.lsn_time_mapping - 此表映射LSN號碼和時間。

表上啓用CDC。

已經啓用CDC所需DB(S)它的時間來檢查是否有與此功能表後:

USE AdventureWorks 
GO 
SELECT [name], is_tracked_by_cdc 
FROM sys.tables 
GO 

如果沒有,我們可以啓用變化捕捉HumanResources.Shift表以下程序:

USE AdventureWorks 
GO 
EXEC sys.sp_cdc_enable_table 
@source_schema = N'HumanResources', 
@source_name = N'Shift', 
@role_name  = NULL 
GO 

確保您SQL代理啓動並運行,因爲它會創建一個作業(cdc.AdventureWorks_capture可能)捉修改。 如果所有程序都正確執行,我們將在系統表中找到一個名爲cdc.HumanResources_Shift_CT的新表,其中包含所有HumanResources.Shift更改。

注意:注意@role_name參數,它指定數據庫信息訪問。

+0

+1爲CDC主題。 – Devart

2

除非您已經安裝了一些審計系統,否則默認情況下無法找到此信息。

假設您的數據庫處於完全恢復模式,唯一的選擇是讀取事務日誌並嘗試從那裏獲取信息。

您可以嘗試使用sql server函數DBCC LOG和fn_dblog或使用第三方工具(如ApexSQL Log)讀取事務日誌。

0

試試這個。它將提供數據庫中每個表的最後更新日期。

USE database_name 

GO 


SELECT OBJECT_NAME(OBJECT_ID) AS DatabaseName, last_user_update,* 
FROM sys.dm_db_index_usage_stats 

GO 

更多參考點擊here

1

正如評論他人,變更數據捕獲,如果你已經實現了他們更改跟蹤將是理想的解決方案。如果你沒有,那麼這裏是一個快速的方法,它會給你一部分信息:

SELECT OBJECT_NAME(OBJECT_ID) AS Object, last_user_update 
FROM sys.dm_db_index_usage_stats 
WHERE database_id = DB_ID(<YourDBName>) 
AND OBJECT_ID=OBJECT_ID(<YourTableName>) 

這會告訴你更新什麼表時,卻未必真爲你的目的,如果你面對的是一個whodunnit場景。此外,它只會爲您提供最新的更新時間戳,也就是說,如果上週有人更新並且昨天更新了其他人,則不會看到上週更新的詳細信息。

拉吉

7

嘗試這一個 -

SELECT 
     [db_name] = d.name 
    , [table_name] = SCHEMA_NAME(o.[schema_id]) + '.' + o.name 
    , s.last_user_update 
FROM sys.dm_db_index_usage_stats s 
JOIN sys.databases d ON s.database_id = d.database_id 
JOIN sys.objects o ON s.[object_id] = o.[object_id] 
WHERE o.[type] = 'U' 
    AND s.last_user_update IS NOT NULL 
    AND s.last_user_update BETWEEN DATEADD(wk, -1, GETDATE()) AND GETDATE() 
+0

+1這是很好的,直到你不需要用戶,操作和變化前的最後一個值。 –

相關問題