Desativar a redução automática em todos os bancos de dados do SQL Server. Por que isso não funciona?

8

Imaginei que poderia usar o sp_MSforeachdb para resolver esse problema, mas recebo uma mensagem de erro.

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;
'

Se eu executar a consulta acima com a linha PRINT descomentada, obtenho uma lista de todos os bancos de dados, exceto os do sistema. No entanto, quando descomente a linha ALTER DATABASE, recebo estas duas mensagens de erro:

Msg 5058, nível 16, estado 2, linha 9 A
opção 'AUTO_SHRINK' não pode ser definida no banco de dados 'mestre'.
Msg 5058, nível 16, estado 1, linha 9 A
opção 'AUTO_SHRINK' não pode ser definida no banco de dados 'tempdb'.

Isso parece interromper a operação em algum momento, para que apenas alguns bancos de dados sejam desativados automaticamente.

Alguma idéia de como posso desativar a redução automática em todos os bancos de dados? Pergunta de bônus: por que minha abordagem não funciona?

Petter Brodin
fonte

Respostas:

7

Infelizmente, o procedimento sp_MSforeachdb é e sempre será sem suporte e, portanto, meio que não é confiável.

Há um artigo no CodeProject que mostra como filtrar bancos de dados ao usar esse banco de dados. Mas tenho o mesmo problema que o seu na minha instalação local do R2 2008. A filtragem não funciona.

Nosso próprio amigo, Aaron, escreveu um bom artigo há algum tempo, sobre como escrever uma versão diferente e melhor do sp_MSforeachdb. Veja o artigo dele aqui . Use esse SP e os parâmetros de filtragem farão o que você precisa.

Marian
fonte
Isso funcionou como um encanto, e até tinha um exemplo para o que eu pretendia realizar. Muito obrigado!
Petter Brodin 22/10/12
3
É melhor agradecer a Aaron :-). Ele fez o roteiro, eu apenas fiz uma pesquisa rápida nele. Digamos que, neste caso, eu sou um índice NC apontando para os dados da folha de índice clusterizado, e ele é o próprio índice clusterizado :-).
Marian
11
Concordo! Mas sem indexação adequada, encontrar os dados corretos podem tornar-se demasiado exigente;)
Petter Brodin
-1

embora isso seja respondido, seria bom descartar esta pequena linha de código que faz exatamente a filtragem que a maioria das pessoas deseja e define AUTO_SHRINK OFF:

EXECUTE sp_MSforeachdb 'IF (''?'' NOT IN (''master'', ''tempdb'', ''msdb'', ''model'')) EXECUTE (''ALTER database ? SET AUTO_SHRINK OFF'')
Gomibushi
fonte