为什么Sql Server 2005维护计划对dbcc checkdb使用了错误的数据库?

时间:2008-08-15 14:45:33

标签: sql-server sql-server-2005

这是我见过的其他人以外的问题,我没有找到一个好的解释。

假设您有一个维护计划,其中包含检查数据库的任务,如下所示:

USE [MyDb]
GO
DBCC CHECKDB with no_infomsgs, all_errormsgs

如果在执行任务后查看日志,您可能会看到如下内容:

08/15/2008 06:00:22,spid55,Unknown,DBCC CHECKDB (mssqlsystemresource) executed by NT AUTHORITY\SYSTEM found 0 errors and repaired 0 errors. Elapsed time: 0 hours 0 minutes 0 seconds.
08/15/2008 06:00:21,spid55,Unknown,DBCC CHECKDB (master) executed by NT AUTHORITY\SYSTEM found 0 errors and repaired 0 errors. Elapsed time: 0 hours 0 minutes 0 seconds.

它没有检查MyDb,而是检查了master和msssqlsystemresource。

为什么?

我的解决方法是使用以下方法创建一个Sql Server代理作业:

dbcc checkdb ('MyDb') with no_infomsgs, all_errormsgs;

这总是很好。

08/15/2008 04:26:04,spid54,Unknown,DBCC CHECKDB (MyDb) WITH all_errormsgs<c/> no_infomsgs executed by NT AUTHORITY\SYSTEM found 0 errors and repaired 0 errors. Elapsed time: 0 hours 26 minutes 3 seconds.

3 个答案:

答案 0 :(得分:1)

对于初学者,请始终记住GO不是SQL关键字;它只是一个批处理分隔符(通常)由客户端而不是服务器实现/识别。因此,根据上下文和客户端,实际上无法保证批次之间保留当前数据库。

答案 1 :(得分:1)

如果您正在使用维护计划,最好使用检查数据库完整性任务。如果你真的想运行自己用t-sql编写的维护,那么使用作业中的步骤运行它,而不是在维护计划中运行它,上面的代码就可以了。就像Stu所说的那样GO语句是客户端指令而不是sql关键字,并且似乎只受到isql,wsql,osql等,客户端和sql代理的尊重。我认为它适用于DTS包。显然,不是在DTSX中。

答案 2 :(得分:0)

你有一个检查数据库完整性任务,你双击它选择MyDb,当计划运行它只检查主?奇怪的。你确定没有其他计划在运行吗?