Disattivazione della riduzione automatica su tutti i database di SQL Server. Perché non funziona?


8

Ho pensato di poter usare sp_MSforeachdb per risolvere questo problema, ma ho ricevuto un messaggio di errore.

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 eseguo la query sopra con la riga PRINT senza commenti, ottengo un elenco di tutti i database ad eccezione dei database di sistema. Tuttavia, quando decomprimere la riga ALTER DATABASE, ottengo questi due messaggi di errore:

Messaggio 5058, livello 16, stato 2, riga 9 L'
opzione "AUTO_SHRINK" non può essere impostata nel database "master".
Messaggio 5058, livello 16, stato 1, riga 9 L'
opzione 'AUTO_SHRINK' non può essere impostata nel database 'tempdb'.

Questo sembra interrompere l'operazione ad un certo punto, in modo che solo alcuni dei database vengano disabilitati con la riduzione automatica.

Hai idea di come posso disabilitare la riduzione automatica su tutti i database? Domanda bonus: perché il mio approccio non funziona?

Risposte:


7

Sfortunatamente, la procedura sp_MSforeachdb è e sarà sempre non supportata e quindi in qualche modo inaffidabile.

C'è un articolo su CodeProject che mostra come filtrare i database quando si utilizza questo DB. Ma ho lo stesso problema del tuo sulla mia installazione locale di R2 2008. Il filtro non funziona.

Il nostro amico Aaron, qualche tempo fa, ha scritto un bell'articolo sulla scrittura di una versione diversa e migliore di sp_MSforeachdb. Vedi il suo articolo qui . Usa SP e i parametri di filtraggio faranno quello che ti serve.


Funzionava come un incantesimo e aveva persino un esempio di ciò che intendevo realizzare. Molte grazie!
Petter Brodin,

3
Faremmo meglio a ringraziare Aaron :-). Ha realizzato la sceneggiatura, ho appena fatto una rapida ricerca. Diciamo in questo caso che sono un indice NC che punta ai dati foglia dell'indice cluster, ed è lui stesso l'indice cluster :-).
Marian,

1
Sono d'accordo! Ma senza una corretta indicizzazione, trovare i dati giusti può diventare troppo impegnativo;)
Petter Brodin,

-1

anche se questa è una risposta, ho pensato che sarebbe carino eliminare questa piccola riga di codice che fa esattamente il filtro che la maggior parte delle persone desidera e imposta AUTO_SHRINK su OFF:

EXECUTE sp_MSforeachdb 'IF (''?'' NOT IN (''master'', ''tempdb'', ''msdb'', ''model'')) EXECUTE (''ALTER database ? SET AUTO_SHRINK OFF'')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.