web-dev-qa-db-ja.com

スキーマの変更がどのように発生したかを確認していますか?

昨日何か悪いことが起こった。

以前に作成されたビューが誰かによって変更されたため、最終的にレポートが壊れました。残念ながら。誰かが(知らず知らずのうちに)PRODUCTIONデータベースでこの変更を行いました。

私の質問:誰(ユーザー名)がこの変更を行ったかを知ることができる方法(スクリプト/ソフトウェア/フリーウェアなど)があるので、そのユーザーの本番データベースへのアクセスを取り消すことができます。

私の質問が不明な場合はコメントしてください。

21
xorpower

これはデフォルトのトレースに記録されるため、有効になっていて、その間にロールオーバーされていない限り、「スキーマ変更履歴」レポートに表示されます。

Management Studioでこれにアクセスするには、データベースを右クリックして、コンテキストメニューからReports -> Standard Reports -> Schema Changes Historyを選択します。

TSQLを介して同じ情報を取得するには、次を使用できます。

SELECT StartTime
       ,LoginName
       --,f.*
FROM   sys.traces t
       CROSS APPLY fn_trace_gettable(REVERSE(SUBSTRING(REVERSE(t.path),
                                                       CHARINDEX('\', REVERSE(t.path)), 
                                                       260)
                                             ) + N'log.trc', DEFAULT) f
WHERE  t.is_default = 1
       AND ObjectName = 'FOO'
       AND EventClass IN (46, /*Object:Created*/
                          47, /*Object:Dropped*/
                          164 /*Object:Altered*/ )
36
Martin Smith

マーティンはすでに最善の方法、つまり通常はオンになっている管理監査トレースを示しました(明示的に無効にされていない限り)。 If管理トレースで情報が見つからない(無効になっているか、リサイクルされていた)あなたcanログバックアップから情報を取得します。は本番DBであるため、定期的なフルバックアップとログバックアップを使用した定期的なバックアップサイクルがあるものとします。 DDLが現在の復元されたログに含まれるように、別のサーバーでデータベースをインシデントの発生時刻前後に復元する必要があります。次に、fn_dblog()を使用してログを検査するだけです。

1つの方法は、トランザクション開始操作を実行することです。

select [Begin Time], [Transaction Name], [Transaction SID], * 
from fn_dblog(null, null)
where Operation = 'LOP_BEGIN_XACT';

ALTER VIEWがスタンドアロントランザクションで発行された場合(つまり、BEGIN TRANSACTION/COMMITで囲まれていない場合)、CreatProc transactionという名前のトランザクションが開始されます。それを探してください。[Transaction SID]は、必要なログインSIDです。

別の可能性は、目的のビューでSCH_Mを取得したトランザクションを探すことです。

select [Lock Information], * 
from fn_dblog(null, null)
where [Lock Information] like '%' + cast(object_id('...') as varchar(10))+'%'
and [Lock Information] like '%LOCK_SCH_M%'
go

DROPに続いてCREATEによってビューが変更された場合、オブジェクトIDは変更された可能性がありますが、少なくとも最後にCREATEを実行したトランザクション(復元されたデータベース内のビューの現在のオブジェクトID)を取得します。トランザクションIDを使用して、戻って開始トランザクション情報を取得します。

select [Begin Time], [Transaction Name], [Transaction SID], *
from fn_dblog(null, null)
where [Transaction ID] = '...'
and Operation = 'LOP_BEGIN_XACT';

[トランザクションSID]は、あなたの担当者です。 SUSER_SNAME を使用して、ログインSIDからログイン名を取得します。 SIDが0x01の場合は、ログインがsaだったことを意味します。これは、saパスワードを知っている個人がログインを実行できたことを意味します。

19
Remus Rusanu

いいえ、DDLトリガーなどを使用してログに記録しない限り

そのデータベースのALTER権限、またはsysadmin/db_owner/ddl_adminロールのメンバーシップとしてだれを表示したいとします。これは魔女狩りよりも一般的なレビューとして優れています。おそらく、承認されていない無許可の変更を加える権利を持つ他の人々もいるでしょう

6
gbn

まだ行っていない場合は、SQL Server Management Studioで利用可能な Schema Changes Historyレポート を確認してください。 SQL Serverはデフォルトで変更をログに記録するように見え( デフォルトトレース )、このレポートを介してそのデータを表示できるはずです。唯一残念なのは、これらのトレースファイルが時間の経過とともに自動的に削除またはロールオーバーされるため、データがすでに失われていることです。幸運を!

0
Mark Madej