9

私は sql server 2008 データベースを持っています。先週更新されたテーブル、つまり新しい行を持つテーブル、既存の行を更新したテーブル、または削除された行を知りたいです。

既存のデータベースに対してこれを行う方法はありますか。

4

5 に答える 5

12

これを試してみてください -

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()
于 2013-05-17T07:59:36.953 に答える
3

Change Data Captureを試してみてください。これは、DB での変更を追跡するための良い方法です。1 つ以上の DB で機能を有効にし、次に 1 つ以上のテーブルで有効にする必要があります (これはテーブル機能であるため、必要なすべてのテーブルに対して行います)。


データベースで CDC を有効にします。

AdventureWorks データベースの CDC を有効にするとします。この機能が動作することを確認するには、次の 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 を有効にします。

目的の DB で CDC を有効にした後、この機能がオンになっているテーブルがあるかどうかを確認します。

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

変更をキャッチするジョブ (おそらく cdc.AdventureWorks_capture) が作成されるため、SQL エージェントが稼働中であることを確認してください。すべての手順が正しく実行されると、システム テーブルの中に cdc.HumanResources_Shift_CT という名前の新しいテーブルが見つかり、すべての HumanResources.Shift の変更が含まれます。

: @role_name パラメータには注意してください。データベース情報へのアクセスを指定します。

于 2013-05-17T07:30:29.393 に答える
2

他の人がコメントしたように、Change Data Capture と Change Tracking は、実装している場合に理想的なソリューションです。まだお持ちでない場合は、ここに簡単な方法があります。これにより、部分的に情報が得られます。

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 シナリオに直面した場合、実際には目的を果たさない可能性があります。また、最新の更新されたタイムスタンプのみが表示されます。つまり、誰かが先週更新し、他の誰かが昨日更新した場合、先週の更新の詳細は表示されません。

ラージ

于 2013-05-17T07:37:04.257 に答える
2

何らかの監査システムがインストールされていない限り、デフォルトでこの情報を見つける方法はありません。

データベースが完全復旧モードにあると仮定すると、唯一のオプションは、トランザクション ログを読み取り、そこから情報を取得することです。

SQL サーバー関数 DBCC LOG および fn_dblog を使用するか、 ApexSQL Logなどのサードパーティ ツールを使用して、トランザクション ログの読み取りを試すことができます。

于 2013-05-17T07:32:54.293 に答える
0

これを試してください。データベース内の各テーブルの最終更新日が表示されます。

USE database_name

GO


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

GO

詳細については、ここをクリックしてください

于 2013-05-17T07:34:37.840 に答える