我正在编写一个计划作业来模仿SQL Express的SQL Server维护计划。 (我必须这样做,因为SQL Express不存在SQL代理和相关工具)
其中一个步骤是进行数据库完整性检查。 TSQL就是:
DBCC CHECKDB(N'Northwind') WITH NO_INFOMSGS
如何知道在执行此命令时是否发生错误,在使用ADO.NET时是否会抛出 异常 ,或者我是否需要解析文本输出 (如果是,我在输出中查找的内容)
这很难测试,因为我手头没有损坏的数据库。
答案 0 :(得分:4)
是的我相信您需要处理从DBCC CHECKDB返回的文本输出。
为了帮助您进行测试,以下参考详细介绍了如何故意破坏SQL Server数据库。
答案 1 :(得分:4)
您可以将TABLERESULTS
选项与CHECKDB
(DBCC CHECKDB WITH TABLERESULTS
)一起使用。
这会为您提供包含Error
,Level
,State
,MessageText
等列的记录集(
该记录集的Level
列(严重性级别)应足以确定是否存在任何错误。
MS表示11到16级是“由用户生成的,可以由用户更正”。所以我要说17以上的任何东西应该意味着:停止进行任何备份(以避免用破坏的备份覆盖好备份),尽可能使系统脱机,并立即通知操作员。
11级到16级也应该向操作员报告(通过常规电子邮件或其他方式),这样他就可以在必要时进行检查。 (我不确定CHECKDB
是否会报告级别为11到16的错误。但是在那里记录错误/通知操作员的代码可能不会受到伤害。)
注意:如果您将TABLERESULTS
与NO_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.如果找到一个,可能还存在某种严重问题。