web-dev-qa-db-ja.com

誰がテーブルを落としたかを判断する方法はありますか?

本番データベースのテーブルが「不思議なことに」消えました。

一体何が起こったのかを診断する方法を知っている人はいますか?そして、誰がそれをしましたか?

編集1:これはセキュリティが弱い内部アプリです。すべてのアプリ(もちろん私のものを除く;-)はSQLインジェクションに対して脆弱ですが、ユーザーは非常に洗練されておらず、テーブル名はそのようなものではありませんでしたすぐにわかるかもしれないので、SQLインジェクションではないと思います(重要ではありません...質問の範囲を超えています)。

編集2:また、参考までに。このテーブルは長い間存在していたため、復元で「元に戻す」ことはありませんでした。

8
John MacIntyre

ログレコードを解釈する文書化されていない:: fn_dblog関数を使用して、ログから情報を取得できる場合があります。現在、ディザスタリカバリのクラスを教えている最中ですが、2〜3時間待つことができれば、その方法を投稿します。ツールを購入しなくても、ユーザー名を取得できるはずです(私は2000年にDBCCCHECKDBが使用する内部ログ分析コードの束を書いたので、2000年にログを1トンも探し回っていました。

[手順を含めるように編集] Ok-教育を終了し、ブログ投稿をノックアップして、2000、2005、2008年にログを分析して、テーブルがいつ削除されたか、誰が削除されたかを確認する方法を示しました。 トランザクションログを使用して誰がテーブルを削除したかを調べる で私のブログ投稿をチェックアウトしてください。[/ edit]

トランザクションログはまだありますか?データベースはどのリカバリモデルにありますか?単純な場合は、チェックポイントを引き起こすようなことは何もしないでください。 FULLまたはBULK_LOGGEDの場合は、ログのバックアップを行わないでください。これらのいずれかにより、ログが切り捨てられ、ログを振り返ることができなくなる可能性がありますが、ブログ投稿にトレースフラグを含めたので、それも役立ちます。

ありがとう

PSセキュリティを追加せずに2000年にテーブルのドロップを防ぐ1つの方法は、単純なスキーマバインドビューを作成することです。ビューが存在する場合、DROPTABLEは失敗します。

14
Paul Randal

多分それはリトルボビーテーブルでした...

8

SSMSでは、dBを右クリックして、[レポート]-> [標準レポート]-> [スキーマ変更履歴]をナビゲートしてみてください。

レポートと「名前を付けて保存」Excelを右クリックして、オブジェクトの名前を見つけます。

オブジェクトがドロップされた後にサーバーが5回以上再起動された場合、何も取得できなくなります。

2
user204862

SQLログからこの情報を回復できる場合があります。

2
RSolberg

デフォルトのトレースログが実行されている場合、すべての情報はログフォルダに保存されます。オブジェクト(テーブル)がいつドロップされ、どの接続によってドロップされたかを確認できるはずです。ただし、このタイプのアクセス許可は、とにかく[〜#〜] dba [〜#〜] sにのみ付与する必要があります。

2
TStamper

破損したMSDBを修正しようとしています。申し訳ありませんが、詳しく説明することができません。

これらを実行すると、デフォルトのトレースがオンになっていると仮定して、どこを見ればよいかが一般的にわかります。

SELECT * FROM :: fn_trace_getinfo(default)

SELECT t.EventID、t.ColumnID、e.name as Event_Description、c.name as Column_Description FROM :: fn_trace_geteventinfo(1)t JOIN sys.trace_events e ON t.eventID = e.trace_event_id JOIN sys.trace_columns c ON t.columnid = c.trace_column_id

2
Raj

この情報を確認する唯一の方法は、トランザクションログを読み取ることです(完全復旧モードであると想定)。

これを行う2つの方法:

  • ApexSQL Log または SQL Log Rescue などのサードパーティツール(無料ですが、SQL 2000のみ)
  • DBCC LOGやfn_dblogなどのコマンドの使用–残念ながらどれも十分に文書化されていません
2