我想构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'