我可以从.NET运行DBCC CHECKDB吗?

时间:2009-05-22 08:29:51

标签: .net sql-server tsql ado.net sql-server-administration

我正在编写一个计划作业来模仿SQL Express的SQL Server维护计划。 (我必须这样做,因为SQL Express不存在SQL代理和相关工具)

其中一个步骤是进行数据库完整性检查。 TSQL就是:

DBCC CHECKDB(N'Northwind')  WITH NO_INFOMSGS

如何知道在执行此命令时是否发生错误,在使用ADO.NET时是否会抛出 异常 ,或者我是否需要解析文本输出 (如果是,我在输出中查找的内容)

这很难测试,因为我手头没有损坏的数据库。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:4)

您可以将TABLERESULTS选项与CHECKDBDBCC CHECKDB WITH TABLERESULTS)一起使用。 这会为您提供包含ErrorLevelStateMessageText等列的记录集(

)。

该记录集的Level列(严重性级别)应足以确定是否存在任何错误。

MS表示11到16级是“由用户生成的,可以由用户更正”。所以我要说17以上的任何东西应该意味着:停止进行任何备份(以避免用破坏的备份覆盖好备份),尽可能使系统脱机,并立即通知操作员。

11级到16级也应该向操作员报告(通过常规电子邮件或其他方式),这样他就可以在必要时进行检查。 (我不确定CHECKDB是否会报告级别为11到16的错误。但是在那里记录错误/通知操作员的代码可能不会受到伤害。)

注意:如果您将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的错误,因此将导致客户端连接关闭。


总结一下:我会跑DBCC CHECKDB WITH TABLERESULTS。如果命令失败,则存在问题(可能是一个问题)。如果没有,继续循环遍历结果集,并查找任何严重性级别> = 17.如果找到一个,可能还存在某种严重问题。