2009-05-22 171 views
4

我正在編寫一個計劃作業來模擬SQL Express的SQL Server維護計劃。 (我必須這樣做,因爲SQL Express不存在SQL代理和相關工具)我可以從.NET運行DBCC CHECKDB嗎?

其中一個步驟是執行數據庫完整性檢查。這樣做的TSQL是:

DBCC CHECKDB(N'Northwind') WITH NO_INFOMSGS 

我怎麼知道,如果這個命令的執行過程中發生錯誤,將它拋出一個異常使用ADO.NET時或我將不得不解析文本輸出的命令(如果是這樣,我在輸出中尋找什麼)

這很難測試,因爲我手邊沒有損壞的數據庫。

回答

2

您可以使用TABLERESULTS選項與CHECKDBDBCC CHECKDB WITH TABLERESULTS)。 這將給你一個列如Error,Level,State,MessageText(其中許多其他)的記錄集。

該記錄集的Level列(嚴重級別)應足以確定是否有任何錯誤。

MS表示級別11到16是「由用戶生成的,並且可以由用戶糾正」。所以我想說17以上的任何內容都應該意味着:停止進行備份(以避免覆蓋損壞的備份),儘可能使系統脫機,並立即通知操作員。

等級11至16也應該向運營商報告(通過普通電子郵件或其他方式),以便他可以在必要時進行檢查。 (我不知道如果CHECKDB永遠不會通過16與報告水平11錯誤雖然具有代碼在那裏將錯誤/可能通知操作雖然不會受到傷害。)

注意:如果你結合TABLERESULTSNO_INFOMSGS,如果CHECKDB沒有發現任何錯誤,你將不是得到任何記錄集,結果,甚至沒有一個沒有行。

NOTE2:在某些情況下,CHECKDB將失敗,並顯示錯誤代碼。到目前爲止,我只看到觸發這個錯誤,它看起來是這樣的:

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的錯誤,所以會導致客戶端連接關閉。我想運行。如果命令失敗,則會出現問題(可能是錯誤的)。如果沒有,繼續循環遍歷結果集,並查找任何嚴重性級別> = 17。如果發現其中一個,那麼可能存在某種嚴重問題。