关闭所有 SQL Server 数据库的自动收缩。为什么这不起作用?

Pet*_*din 8 sql-server-2005 sql-server-2008 sql-server

我想我可以使用 sp_MSforeachdb 来解决这个问题,但我收到一条错误消息。

sp_MSforeachdb '
BEGIN
USE [?]
DECLARE @dbid INT
SET @dbid = DB_ID()
IF(@dbid > 4)
BEGIN
    --PRINT ''[?]'' + CONVERT(VARCHAR, @dbid)
    --ALTER DATABASE [?] SET AUTO_SHRINK OFF
END
END;
'
Run Code Online (Sandbox Code Playgroud)

如果我在未注释 PRINT 行的情况下运行上述查询,我​​将获得除系统数据库之外的所有数据库的列表。但是,当我取消注释 ALTER DATABASE 行时,我收到以下两条错误消息:

消息 5058,级别 16,状态 2,第 9 行
无法在数据库“master”中设置选项“AUTO_SHRINK”。
消息 5058,级别 16,状态 1,第 9 行
无法在数据库“tempdb”中设置选项“AUTO_SHRINK”。

这似乎在某些时候中断了操作,因此只有一些数据库被禁用自动收缩。

知道如何在所有数据库上禁用自动收缩吗?额外问题:为什么我的方法不起作用?

Mar*_*ian 7

不幸的是,过程 sp_MSforeachdb 是并且将始终不受支持,因此有点不可靠。

CodeProject上有一篇文章展示了如何在使用此数据库时过滤数据库。但是我在本地 2008 R2 安装中遇到了与您相同的问题。过滤不起作用。

我们自己的朋友 Aaron 前段时间写了一篇很好的文章,关于编写 sp_MSforeachdb 的不同且更好的版本。在此处查看他的文章。使用该 SP,过滤参数将满足您的需求。

  • 我们最好感谢 Aaron :-)。他制作了剧本,我只是快速搜索了一下。假设在这种情况下,我是一个指向聚集索引叶数据的 NC 索引,而他是聚集索引本身 :-)。 (3认同)