web-dev-qa-db-ja.com

DBCC CheckDbで自発的にエラーを生成する

DBCC CheckDBでエラーを発生させる方法を知っている人はいますか?私はスクリプトをテストしていて、エラーを返すために、最も簡単なモードでDBCC Checkdbが必要です。修復しようとしているときや、シングルユーザーモードにしようとしているときも...

使用しているシンプルなdbcc checkdbコマンドは、バッチファイルの一部であり、次のとおりです。

OSQL -S MYPC -E -d MyDB -l 10 -Q "DBCC CHECKDB(AG_DB_STORESQL)" -b -o c:\MyFolder\MSSQL_DB_CHECK.Log

エラーが見つからない場合、スクリプトは終了します。エラーが見つかった場合、スクリプトはREPAIR_REBUILDオプションを使用してエラーを修正しようとし、失敗した場合、スクリプトはREPAIR_ALLOW_DATA_LOSSオプションを使用してエラーを修正しようとします。明らかに、スクリプトを修復しようとする前に、DBをシングルユーザーモードにしようとします(これもエラートラップです)。

したがって、私が探しているのは、DBCC CheckDBがエラーを返すようにする方法です。

3
JohnG

DBCC CheckDBでエラーを発生させる方法を知っている人はいますか?

lethaldbcc writepage ({'dbname' | dbid}, fileid, pageid, offset, length, data [, directORbufferpool])ON a TEST(NON- PROD)の完全なサンドボックス環境

DBCC WRITEPAGEの目的は次のとおりです。

  • DBCC CHECKDBの自動テストとSQL Serverチームによる修復を可能にするため。
  • デモやテストのために破損を設計するため。
  • ライブの破損したデータベースを手動で編集することにより、最後のディザスタリカバリを可能にします。

"The Guru"とは別に Paul Randal@ SteveStedman は優れています 一連のデータベース破損の課題 (解決策あり-しかし、後で参照自分で対処してみてください)。

4
Kin Shah

この目的でストアドプロシージャを作成できます。

CREATE PROCEDURE CheckDBRaiseError(@db varchar(255)) AS
SET NOCOUNT ON
IF OBJECT_ID('TEMPDB..#CheckDB') IS NOT NULL DROP TABLE #CheckDB
CREATE TABLE #CheckDB
    ([Error] int, [Level] int, [State] int,  
     [MessageText] varchar(7000), [RepairLevel] int, [Status] int, 
     [DbId] int, [ObjectID] int, [IndexId] int, [PartitionId] int, 
     [AllocUnitId] int, [File] int, [Page] int, [Slot] int,  
     [RefFile] int, [RefPage] int, [RefSlot] int, [Allocation] int); 
INSERT INTO #CheckDB
EXEC ('DBCC CHECKDB('+@db+') WITH TABLERESULTS')
DECLARE @Result varchar(4000)
SELECT TOP 1 @Result = MessageText FROM #CheckDB WHERE MessageText LIKE 'CHECKDB%allocation errors%'
IF @Result NOT LIKE '%0 allocation errors and 0 con%'
  RAISERROR('DBCC Error: %s', 20, 1, @Result) WITH LOG

次に、コマンドラインを次のように更新します

OSQL -S MYPC -E -d MyDB -l 10 -Q "EXEC CheckDBRaiseError 'AG_DB_STORESQL'" -b -o c:\MyFolder\MSSQL_DB_CHECK.Log