私は sql server 2008 データベースを持っています。先週更新されたテーブル、つまり新しい行を持つテーブル、既存の行を更新したテーブル、または削除された行を知りたいです。
既存のデータベースに対してこれを行う方法はありますか。
私は sql server 2008 データベースを持っています。先週更新されたテーブル、つまり新しい行を持つテーブル、既存の行を更新したテーブル、または削除された行を知りたいです。
既存のデータベースに対してこれを行う方法はありますか。
これを試してみてください -
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()
Change Data Captureを試してみてください。これは、DB での変更を追跡するための良い方法です。1 つ以上の DB で機能を有効にし、次に 1 つ以上のテーブルで有効にする必要があります (これはテーブル機能であるため、必要なすべてのテーブルに対して行います)。
データベースで CDC を有効にします。
AdventureWorks データベースの CDC を有効にするとします。この機能が動作することを確認するには、次の SP を実行する必要があります。
USE AdventureWorks
GO
EXEC sys.sp_cdc_enable_db
GO
その結果、cdcと呼ばれる新しいスキーマといくつかのテーブルが自動的に追加されます。
テーブルで 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 パラメータには注意してください。データベース情報へのアクセスを指定します。
他の人がコメントしたように、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 シナリオに直面した場合、実際には目的を果たさない可能性があります。また、最新の更新されたタイムスタンプのみが表示されます。つまり、誰かが先週更新し、他の誰かが昨日更新した場合、先週の更新の詳細は表示されません。
ラージ
何らかの監査システムがインストールされていない限り、デフォルトでこの情報を見つける方法はありません。
データベースが完全復旧モードにあると仮定すると、唯一のオプションは、トランザクション ログを読み取り、そこから情報を取得することです。
SQL サーバー関数 DBCC LOG および fn_dblog を使用するか、 ApexSQL Logなどのサードパーティ ツールを使用して、トランザクション ログの読み取りを試すことができます。
これを試してください。データベース内の各テーブルの最終更新日が表示されます。
USE database_name
GO
SELECT OBJECT_NAME(OBJECT_ID) AS DatabaseName, last_user_update,*
FROM sys.dm_db_index_usage_stats
GO
詳細については、ここをクリックしてください