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


8

我以为可以使用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;
'

如果我在没有注释PRINT行的情况下运行上述查询,则会获得除系统数据库以外的所有数据库的列表。但是,当我取消注释ALTER DATABASE行时,出现以下两个错误消息:

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

这似乎在某种程度上破坏了该操作,因此只有部分数据库被禁用了自动收缩。

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

Answers:


7

不幸的是,过程sp_MSforeachdb一直而且将永远不受支持,因此有点不可靠。

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

我们自己的朋友Aaron不久前写了一篇不错的文章,内容涉及编写sp_MSforeachdb的另一个更好的版本。在这里看他的文章。使用该SP,过滤参数将满足您的需求。


那就像一个魅力,甚至为我打算实现的目标提供了一个例子。非常感谢!
彼得·布罗丁

3
我们最好感谢亚伦:-)。他编写了脚本,我只是对其进行了快速搜索。假设在这种情况下,我是一个NC索引,指向聚集索引叶数据,而他是聚集索引本身:-)。
玛丽安2012年

1
我同意!但是如果没有正确的索引编制,找到正确的数据可能会变得太困难了;)
Petter Brodin

-1

尽管可以回答这一问题,但我还是希望删除这行代码来完成大多数人想要的过滤并将AUTO_SHRINK设置为OFF会很不错:

EXECUTE sp_MSforeachdb 'IF (''?'' NOT IN (''master'', ''tempdb'', ''msdb'', ''model'')) EXECUTE (''ALTER database ? SET AUTO_SHRINK OFF'')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.