Desactivar la reducción automática en todas las bases de datos de SQL Server. ¿Por qué esto no funciona?

8

Pensé que podría usar sp_MSforeachdb para resolver este problema, pero recibo un mensaje de error.

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

Si ejecuto la consulta anterior con la línea PRINT sin comentarios, obtengo una lista de todas las bases de datos excepto las bases de datos del sistema. Sin embargo, cuando descomento la línea ALTER DATABASE, recibo estos dos mensajes de error:

Msg 5058, Nivel 16, Estado 2, Línea 9 La
opción 'AUTO_SHRINK' no se puede configurar en la base de datos 'maestro'.
Msg 5058, Nivel 16, Estado 1, Línea 9 La
opción 'AUTO_SHRINK' no se puede configurar en la base de datos 'tempdb'.

Esto parece interrumpir la operación en algún momento, de modo que solo algunas de las bases de datos se deshabilitan automáticamente.

¿Alguna idea de cómo puedo desactivar la reducción automática en todas las bases de datos? Pregunta extra: ¿por qué mi enfoque no funciona?

Petter Brodin
fuente

Respuestas:

7

Desafortunadamente, el procedimiento sp_MSforeachdb es y siempre será incompatible y, por lo tanto, poco confiable.

Hay un artículo sobre CodeProject que muestra cómo filtrar bases de datos cuando se usa este DB. Pero tengo el mismo problema que el tuyo en mi instalación local de 2008 R2. El filtrado no funciona.

Nuestro propio amigo, Aaron, escribió un buen artículo hace algún tiempo, sobre escribir una versión diferente y mejor de sp_MSforeachdb. Ver su artículo aquí . Use ese SP y los parámetros de filtrado harán lo que necesita.

Mariana
fuente
Eso funcionó a las mil maravillas, e incluso tenía un ejemplo de lo que pretendía lograr. ¡Muchas gracias!
Petter Brodin
3
Será mejor que agradezcamos a Aaron :-). Hizo el guión, solo hice una búsqueda rápida. Digamos que en este caso soy un índice NC que apunta a los datos de hoja de índice agrupados, y él es el índice agrupado en sí :-).
Marian
1
¡Estoy de acuerdo! Pero sin una indexación adecuada, encontrar los datos correctos puede ser demasiado exigente;)
Petter Brodin
-1

aunque esto es respondido, pensé que sería bueno dejar caer esta pequeña línea de código que hace exactamente el filtrado que la mayoría de la gente quiere y desactiva AUTO_SHRINK:

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