100以上のテーブルを持つデータベースがあります。必要に応じて、既存のテーブルに列を継続的に追加し、新しいテーブルもいくつか追加しました。
次に、過去3か月に行った変更を確認します。 MS SQL Server 2012には、その特定のデータベースが変更を追跡するためのアクティビティログがありますか。
現在、オプションは限られています。今後は、以下で試してみて、役立つかどうかを確認してください。
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か月以上あり、それらを復元する必要がある場合にのみ機能します。
おそらくこれはあなたを途中で止めることができます。 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トリガーを作成できます。
過去のすべてのアクティビティを確認するには、MSSQL監査を使用できます。変更をいつでも追跡するのに最適な方法です。確認してください https://msdn.Microsoft.com/en-us/library/cc280386.aspx
テープなどで3か月前のバックアップがある場合、バックアップを別の名前または別のサーバーに復元し、サードパーティのツール(Visual Studio、Devartスキーマ比較など)を介してスキーマ比較を実行できます。
それ以外の場合は、Gameiswarなどで説明されているように、必要になる前にメカニズムを事前にセットアップすることが唯一の方法です。
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
このクエリは、ストアドプロシージャの作成および変更の最終日を示します。
select name,create_date,modify_date
from sys.procedures
order by modify_date desc