すべての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行のコメントを外すと、次の2つのエラーメッセージが表示されます。

メッセージ5058、レベル16、状態2、行9
オプション 'AUTO_SHRINK'をデータベース 'master'に設定できません。
メッセージ5058、レベル16、状態1、行9
オプション 'AUTO_SHRINK'をデータベース 'tempdb'に設定できません。

これにより、ある時点で操作が中断され、一部のデータベースのみで自動圧縮が無効になります。

すべてのデータベースで自動縮小を無効にするにはどうすればよいですか?おまけの質問:なぜ私のアプローチが機能しないのですか?

回答:


7

残念ながら、プロシージャsp_MSforeachdbはサポートされておらず、今後もサポートされないため、信頼性が低くなります。

このDBを使用するときにデータベースをフィルタリングする方法を示すCodeProjectに関する記事があります。しかし、私は私のローカル2008 R2インストールであなたと同じ問題を抱えています。フィルタリングが機能しません。

私たちの友人であるアーロンは、sp_MSforeachdbの別のより良いバージョンを書くことについて、素晴らしい記事を少し前に書きました。こちらの記事をご覧ください。そのSPを使用すると、フィルタリングパラメーターが必要な処理を実行します。


それは魅力のように働きました、そしてそれは私が成し遂げようとしていたことの例さえありました。どうもありがとう!
Petter Brodin、2012年

3
アーロンに感謝します:-)。彼が脚本を作ってくれたので、すぐに検索しました。この場合、私がクラスタードインデックスリーフデータを指すNCインデックスであり、それがクラスタードインデックスそのものであるとします。
マリアン

1
同意する!しかし、適切なインデックス付けを行わないと、適切なデータを見つけるのが非常に難しくなる可能性があります;)
Petter Brodin 2012年

-1

これは回答されていますが、ほとんどの人が希望するフィルタリングを正確に実行し、AUTO_SHRINKをオフに設定する次の短いコード行を削除するのは良いことですが、

EXECUTE sp_MSforeachdb 'IF (''?'' NOT IN (''master'', ''tempdb'', ''msdb'', ''model'')) EXECUTE (''ALTER database ? SET AUTO_SHRINK OFF'')
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.