誰がテーブルをドロップしたかを特定する方法はありますか?


8

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

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

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

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


"Not Me"ゴーストもあなたを手に入れたのですか?
Nick DeVore

全員に個別のデータベースアカウントを持っていますか、それとも全員が 'dba'または同等のものとしてログインしますか?

@ Zerofiz-私たちはWindows統合セキュリティを使用しているため、すべてのユーザーを識別できます。
ジョンマッキンタイア

誰がテーブルdbarepublic.com/2015/01/who-dropped-table.htmlをドロップしたかを特定するための段階的なプロセスを説明しているこのブログに出くわしました

回答:


14

ログ記録を解釈する文書化されていない:: fn_dblog関数を使用して、ログから情報を取得できる場合があります。私は現在、災害復旧クラスを教えている最中ですが、2〜3時間待つことができる場合は、その方法を投稿します。ツールを購入することなく、ユーザー名も取得できるはずです(私は、2000年にDBCC CHECKDBが2000年に使用する一連の内部ログ分析コードを作成したため、2000年に大量のログを調べていました。

[手順を含むように編集]わかりました-教え終わったので、2000、2005、2008年にログを分析して、テーブルがいつ削除され、誰が実行したかを調べる方法を示すブログ投稿を公開しました。トランザクションログを使用してテーブルを削除したユーザーを確認するの私のブログ投稿をご覧ください。[/編集]

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

ありがとう

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


Paulさん、ありがとうございます。私は待つことができる。私は今出発し、明日別のクライアントに行くので、木曜日に何が起こったかを理解しようとしています。ログのバックアップについて管理者に伝えます。
ジョンマッキンタイア

8

多分それはリトルボビーテーブルだった...


1
ニース:)ユーモアのために+1しますが、他の唯一の回答も1票なので、ばかげたことになります。

2
いや、それは賛成投票には十分面白い。
Electrons_Ahoy

2

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


この情報がSQLServerログにあることは知っていますが、それらから何も読み取れないと思いました。あなたができることを見つけたいです。誰か知ってる?
ジョンマッキンタイア

私はSybase SQL Anywhereにのみ精通していますが、ログファイルをSQLステートメントに変換するユーティリティがあります...

1
このツールは、ログの読み取りに役立つ場合があります。red-gate.com/products/SQL_Log_Rescue/index.htm
RSolberg

ログツールリンクの+1。答えに入れてみませんか?
ジョンマッキンタイア

2

デフォルトのトレースログが実行されている場合、すべての情報はログフォルダーに保存されます。オブジェクト(テーブル)がいつ削除され、どの接続で削除されたかを確認できるはずです。ただし、このタイプの権限は、いずれにしてもDBAにのみ付与する必要があります


2

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

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

SELECT * FROM :: fn_trace_getinfo(デフォルト)

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


ありがとう、sys。*テーブルは2005年だと思いますが、そうではありませんか?2000年相当はありますか?
ジョンマッキンタイア

2

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

これを行う2つの方法:

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

2

SSMSでは、dBを右クリックして、[レポート]-> [標準レポート]-> [スキーマ変更履歴]に移動してみることができます。

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

オブジェクトが削除された後にサーバーが5回以上再起動された場合は、何も取得できません。


ログの確認に失敗しました。システムのトランザクション数が多いため、ほとんどがオーバーランでした。あなたの方法は完璧に働きました。共有してくれてありがとう!
タイラージガーランド2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.