5

SQL Express の SQL Server 保守計画を模倣するスケジュールされたジョブを作成しています。(SQL Express 用の SQL エージェントおよび関連ツールが存在しないため、これを行う必要があります)

手順の 1 つは、データベースの整合性チェックを行うことです。このための TSQL は次のとおりです。

DBCC CHECKDB(N'Northwind')  WITH NO_INFOMSGS

このコマンドの実行中にエラーが発生したかどうか、 ADO.NET を使用しているときに例外がスローされるかどうか、またはコマンドのテキスト出力を解析する必要があるかどうか (そうであれば、出力で何を探すべきか) を知るにはどうすればよいですか?

手元に破損したデータベースがないため、これをテストするのは困難です。

4

2 に答える 2

5

TABLERESULTSオプションはCHECKDB( ) で使用できますDBCC CHECKDB WITH TABLERESULTSErrorこれにより、 、LevelStateMessageText(その他多数) のような列を持つレコードセットが得られます。

Levelエラーがあるかどうかを判断するには、そのレコードセットの列 (重大度レベル) で十分です。

MS は、レベル 11 から 16 は「ユーザーによって生成され、ユーザーが修正できる」と述べています。したがって、17 を超える場合は、バックアップの作成を停止し (壊れたバックアップで正常なバックアップを上書きしないようにするため)、可能であればシステムをオフラインにして、すぐにオペレーターに通知する必要があります。

また、レベル 11 から 16 についても (通常の電子メールなどで) オペレーターに報告し、必要に応じて確認できるようにする必要があります。(CHECKDBただし、レベル 11 から 16 でエラーが報告されるかどうかはわかりません。エラーをログに記録したり、オペレーターに通知したりするためのコードがそこにあれば、おそらく害はありません。)

: と組み合わせTABLERESULTSNO_INFOMSGS、 でCHECKDBエラーが見つからない場合、結果としてレコードセット取得されず、行のないレコードセットも取得されません。

注 2 : 特定の条件下でCHECKDBは、エラー コードで失敗するだけです。これまでのところ、これをトリガーするエラーは 1 つしか見たことがありません。次のようになります。

Msg 211, Level 23, State 51, Line 3
Possible schema corruption. Run DBCC CHECKCATALOG.
Msg 0, Level 20, State 0, Line 0
A severe error occurred on the current command.  The results, if any, should be discarded.

私は ADO.NET をあまり使っていませんが、ADO.NET は例外をスローして反応すると思います。また、これは重大度が 20 以上のエラーであるため、クライアント接続が閉じられます。


これをすべて要約すると、私は実行しますDBCC CHECKDB WITH TABLERESULTS。コマンドが失敗した場合は、問題があります (おそらく重大な問題)。そうでない場合は、結果セットをループして、17 以上の重大度を探します。重大度が見つかった場合は、何らかの深刻な問題もある可能性があります。

于 2012-02-16T20:04:11.110 に答える
4

はい、DBCC CHECKDB から返されたテキスト出力を処理する必要があると思います。

テストを支援するために、次のリファレンスでは、SQL Server データベースを意図的に破損させる方法について詳しく説明しています。

http://sqlblogcasts.com/blogs/tonyrogerson/archive/2007/03/10/how-to-create-a-corrupt-database-using-bulk-insert-update-and-bcp-sql-server-as- a-hex-editor.aspx

于 2009-05-22T08:38:06.323 に答える