5

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

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

DBCC CHECKDB(N'Northwind')  WITH NO_INFOMSGS

我如何知道在执行此命令期间是否发生错误,在使用 ADO.NET 时是否会引发异常,或者我是否必须解析命令的文本输出(如果是,我在输出中查找什么)

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

4

2 回答 2

5

您可以使用TABLERESULTS带有CHECKDB( DBCC CHECKDB WITH TABLERESULTS) 的选项。这将为您提供一个记录集,其中包含Error, Level, State,等列MessageText(以及许多其他列)。

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

MS 表示,级别 11 到 16 是“由用户生成的,并且可以由用户更正”。所以我想说 17 以上的任何东西都应该意味着:停止做任何备份(以避免用损坏的备份覆盖好的备份),如果可能的话让系统脱机,并立即通知操作员。

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

注意:如果您与 结合TABLERESULTS使用NO_INFOMSGS,并且如果CHECKDB没有发现任何错误,您将不会得到任何记录集,甚至没有一个没有行的记录集。

注意2:在某些情况下,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。如果找到,则可能也存在某种严重问题。

于 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 回答