web-dev-qa-db-ja.com

データベースMS SQL Serverのアクティビティログ

100以上のテーブルを持つデータベースがあります。必要に応じて、既存のテーブルに列を継続的に追加し、新しいテーブルもいくつか追加しました。

次に、過去3か月に行った変更を確認します。 MS SQL Server 2012には、その特定のデータベースが変更を追跡するためのアクティビティログがありますか。

13
trighati

現在、オプションは限られています。今後は、以下で試してみて、役立つかどうかを確認してください。

1.監査を有効にしている場合、変更を追跡できます

監査を有効にしている場合は、以下のクエリを使用して確認できます。

select * from sys.dm_server_audit_status

監査を有効にしていない場合は、次のように有効にすることができます: SQL Server監査の概要 ..質問に記載されているもの以外をキャプチャする必要がない限り、監査を有効にすることはお勧めしません。

2.デフォルトのトレースは作成されたテーブルもキャプチャしますが、これはファイルメカニズムをロールオーバーして、スペースがいっぱいになったときに最後のファイルを上書きするため、運が悪い場合があります(3か月の範囲を求めているため)。 SQL Serverからデフォルトで取得できるイベント情報は何ですか? デフォルトのトレースによって提供されるすべてのことを知るために見つける

私はこのオプションを使用して、それらがロールアップされるタイミングに応じて、それらのファイルのバックアップを試みます(テーブルの変更を確認するだけでよいため)

3.最後に1つの最後のオプションはTlogをクエリすることです

select * from fn_dblog(null,null) where [transaction name]='CREATE TABLE'

上記のTlogオプションは、Tlogバックアップが3か月以上あり、それらを復元する必要がある場合にのみ機能します。

7
TheGameiswar

おそらくこれはあなたを途中で止めることができます。 sys.objectsは日付を作成および変更しますが、残念ながらsys.columns ではない。ただし、追加された最新の列のcolumn_idは高くなります。削除された列を簡単に見つけることができるとは思いません。列の変更以外の変更は、変更日によって反映されることに注意してください。

select  s.name [schema], o.name [table], o.modify_date [table_modify_date], c.column_id, c.name
from    sys.schemas s
join    sys.objects o on o.schema_id = s.schema_id
left    join sys.columns c on c.object_id = o.object_id
where   o.type = 'U'    --user tables only
and     o.modify_date >= dateadd(M,-3, getdate())
order   by s.name, o.name, column_id;

SSDTデータプロジェクトのようなものを使用して変更を管理する場合は、将来的にこの監査を容易にするために、すべてのスキーマ変更をテーブルまたはソース管理に記録するDDLトリガーを作成できます。

7
SMM

過去のすべてのアクティビティを確認するには、MSSQL監査を使用できます。変更をいつでも追跡するのに最適な方法です。確認してください https://msdn.Microsoft.com/en-us/library/cc280386.aspx

3
Ranjana Ghimire

DBの右クリックメニューからレポートを実行できます。

enter image description here

このドロップダウンに興味を持つかもしれないいくつかのレポートがあります。または、必要な情報だけを含むカスタムレポートを作成することもできます。

私のスキーマレポートは2016年9月3日まで遡りますが、毎日60以上の列を持つ1000以上のテーブルに多数の更新があります。あなたはさらに戻るかもしれません。

3
Mike

テープなどで3か月前のバックアップがある場合、バックアップを別の名前または別のサーバーに復元し、サードパーティのツール(Visual Studio、Devartスキーマ比較など)を介してスキーマ比較を実行できます。

それ以外の場合は、Gameiswarなどで説明されているように、必要になる前にメカニズムを事前にセットアップすることが唯一の方法です。

1

DDLトリガーを使用できます。

CREATE TRIGGER ColumnChanges  
ON DATABASE   
FOR ALTER_TABLE  
AS  
DECLARE @data XML  
SET @data = EVENTDATA()  
INSERT alter_table_log   
   (PostTime, DB_User, Event, TSQL)   
   VALUES   
   (GETDATE(),   
   CONVERT(nvarchar(100), CURRENT_USER),   
   @data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'),   
   @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(2000)') ) ;  
GO  
1
Steve Ford

このクエリは、ストアドプロシージャの作成および変更の最終日を示します。

select name,create_date,modify_date
from sys.procedures
order by modify_date desc
0
Malik Usman

SQL Server Management Studioの[スクリプトの生成...]タスクオプションを使用して、メタデータ定義のスナップショットを作成します。

enter image description here

生成されたスクリプトファイルを、現在の日付を参照する名前のフォルダーに保存します。これが複数回行われると、WinDiffを使用して、任意の2つのスナップショット間で行われたデータベースの変更を強調表示できます。 「スクリプトの生成」オプションを注意深く一貫して選択して、時間ベースの比較がより有益になるようにします。

0
JohnH