Отключение автоматического сжатия во всех базах данных 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
Параметр «AUTO_SHRINK» не может быть установлен в базе данных «master».
Сообщение 5058, уровень 16, состояние 1, строка 9
Параметр «AUTO_SHRINK» не может быть установлен в базе данных «tempdb».

Кажется, что в какой-то момент это нарушает работу, поэтому автоматическое сжатие отключено только для некоторых баз данных.

Любая идея, как я могу отключить автоматическое сжатие на всех базах данных? Бонусный вопрос: почему мой подход не работает?

Петер Бродин
источник

Ответы:

7

К сожалению, процедура sp_MSforeachdb является и всегда будет неподдерживаемой, а значит, ненадежной.

Есть статья о CodeProject, которая показывает, как фильтровать базы данных при использовании этой БД. Но у меня та же проблема, что и у вас на моей локальной установке 2008 R2. Фильтрация не работает.

Наш собственный друг, Аарон, некоторое время назад написал хорошую статью о написании другой и лучшей версии sp_MSforeachdb. Смотрите его статью здесь . Используйте этот SP, и параметры фильтрации будут делать то, что вам нужно.

Мэриан
источник
Это сработало как шарм, и у него даже был пример того, чего я собирался достичь. Большое спасибо!
Петтер Бродин
3
Нам лучше поблагодарить Аарона :-). Он сделал сценарий, я просто быстро его нашел. Допустим, в этом случае я являюсь индексом NC, указывающим на данные листа кластеризованного индекса, и он сам является кластеризованным индексом :-).
Мариан
1
Согласен! Но без надлежащей индексации поиск нужных данных может стать слишком сложным;)
Петтер Бродин
-1

хотя на это есть ответ, я просто хотел бы убрать эту небольшую строчку кода, которая выполняет именно ту фильтрацию, которую хочет большинство людей, и устанавливает AUTO_SHRINK OFF:

EXECUTE sp_MSforeachdb 'IF (''?'' NOT IN (''master'', ''tempdb'', ''msdb'', ''model'')) EXECUTE (''ALTER database ? SET AUTO_SHRINK OFF'')
Gomibushi
источник