Achei que poderia usar 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 sem comentários, obterei uma lista de todos os bancos de dados, exceto os bancos de dados do sistema. No entanto, quando descomento 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 ponto, de modo que apenas alguns dos bancos de dados sejam desabilitados.
Alguma ideia de como posso desabilitar a redução automática em todos os bancos de dados? Pergunta bônus: por que minha abordagem não funciona?
Infelizmente, o procedimento sp_MSforeachdb é e sempre será sem suporte e, portanto, não é confiável.
Há um artigo no CodeProject que mostra como filtrar bancos de dados ao usar este banco de dados. Mas eu tenho o mesmo problema que o seu na minha instalação local do 2008 R2. 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.
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: