使用 sp_msforeachdb 设置恢复模型

Rya*_*anB 1 sql-server

我想构建一个脚本,将每个用户数据库的恢复模式设置为 SIMPLE,并将其放入我的开发服务器的代理作业中。看起来很简单(抱歉双关语):

EXEC sp_msforeachdb 'USE ?; IF DB_ID() >= 5 ALTER DATABASE ? SET RECOVERY SIMPLE;'
Run Code Online (Sandbox Code Playgroud)

它也有效。只针对正确的数据库执行,等等。但是,我收到以下错误消息:

消息 5058,级别 16,状态 1,第 1 行
无法在数据库 'tempdb' 中设置选项 'RECOVERY'。

我可以针对用户数据库的 sys.databases 视图编写动态 SQL,但我想知道为什么 sp_msforeachdb 会生成此错误。

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

编辑:将代码设置为排除 ID < 5 的任何数据库,我很困惑为什么我会收到此错误。

Jas*_*and 6

您必须使用动态 SQL 来实现这一点,因为无论检查如何,都会为每个数据库评估 DDL,但由于检查,它不会被执行。

set quoted_identifier on

EXEC sp_msforeachdb "
IF '?' not in ('tempdb')
begin
    exec ('ALTER DATABASE [?] SET RECOVERY SIMPLE;')
    print '?'
end
"
Run Code Online (Sandbox Code Playgroud)