使用sp_msforeachdb设置恢复模型

我想构build一个脚本,将每个用户数据库的RECOVERY MODE设置为SIMPLE,并将其置于我的开发服务器的代理作业中。 这似乎很简单(对双关抱歉):

EXEC sp_msforeachdb 'USE ?; IF DB_ID() >= 5 ALTER DATABASE ? SET RECOVERY SIMPLE;' 

它也可以。 只有执行正确的数据库,所有这一切。 但是,我收到以下错误消息:

1号线1号楼16楼5058号消息
选项'RECOVERY'不能在数据库'tempdb'中设置。

我可以针对用户数据库的sys.databases视图编写dynamicSQL,但是我想知道为什么sp_msforeachdb会产生这个错误。

有没有人有任何经验可以阐明这一点?

编辑:与代码集排除任何数据库的ID <5,我感到困惑,为什么我得到这个错误。

您必须使用dynamicSQL来实现这一点,因为无论检查如何,DDL都会针对每个数据库进行评估,但是由于该检查而无法执行。

 set quoted_identifier on EXEC sp_msforeachdb " IF '?' not in ('tempdb') begin exec ('ALTER DATABASE [?] SET RECOVERY SIMPLE;') print '?' end " 

根据文档:“TempDB上不允许备份和恢复”。

这是因为它只是临时存储(备份和临时不在一起)。 所以,如果你需要支持,你做错了什么。 换句话说,微软正试图防止错误。

包含tempdb其他限制的参考文档: http : //msdn.microsoft.com/en-us/library/ms190768.aspx

你得到这个错误,因为DB_ID()计算到“当前”数据库。 因此,如果您在master中执行了sp_msforeachdb语句,则db_id()将始终评估为1,因此条件将始终评估为true。 我怀疑你想要这样的东西:

 EXEC sp_msforeachdb 'IF DB_ID(''?'') >= 5 ALTER DATABASE [?] SET RECOVERY SIMPLE;' 
 EXEC sp_MSforeachdb N'IF DatabasePropertyEx(''?'', ''Recovery'')=''FULL'' and DatabasePropertyEx(''?'', ''Status'')=''ONLINE'' and ''?'' not in (''tempdb'') begin exec (''ALTER DATABASE [?] SET RECOVERY SIMPLE;'') print ''?'' end'