Désactivation de la réduction automatique sur toutes les bases de données SQL Server. Pourquoi ça ne marche pas?

8

J'ai pensé que je pouvais utiliser sp_MSforeachdb pour résoudre ce problème, mais je reçois un message d'erreur.

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 j'exécute la requête ci-dessus avec la ligne PRINT sans commentaire, j'obtiens une liste de toutes les bases de données à l'exception des bases de données système. Cependant, lorsque je décommente la ligne ALTER DATABASE, j'obtiens ces deux messages d'erreur:

Msg 5058, niveau 16, état 2, ligne 9 L'
option 'AUTO_SHRINK' ne peut pas être définie dans la base de données 'master'.
Msg 5058, niveau 16, état 1, ligne 9 L'
option 'AUTO_SHRINK' ne peut pas être définie dans la base de données 'tempdb'.

Cela semble interrompre l'opération à un moment donné, de sorte que seules certaines des bases de données sont désactivées automatiquement.

Une idée de comment désactiver la réduction automatique sur toutes les bases de données? Question bonus: pourquoi mon approche ne fonctionne-t-elle pas?

Petter Brodin
la source

Réponses:

7

Malheureusement, la procédure sp_MSforeachdb est et sera toujours non prise en charge et donc peu fiable.

Il y a un article sur CodeProject qui montre comment filtrer les bases de données lors de l'utilisation de cette base de données. Mais j'ai le même problème que le vôtre sur mon installation locale 2008 R2. Le filtrage ne fonctionne pas.

Notre propre ami, Aaron, a écrit il y a quelque temps un bel article sur l'écriture d'une version différente et meilleure de sp_MSforeachdb. Voir son article ici . Utilisez ce SP et les paramètres de filtrage feront ce dont vous avez besoin.

Marian
la source
Cela fonctionnait comme un charme, et cela avait même un exemple de ce que j'avais l'intention d'accomplir. Merci beaucoup!
Petter Brodin
3
Nous ferions mieux de remercier Aaron :-). Il a fait le script, je viens de faire une recherche rapide. Disons que dans ce cas, je suis un index NC pointant vers les données de feuille d'index cluster, et il est l'index cluster lui-même :-).
Marian
1
Je suis d'accord! Mais sans indexation appropriée, trouver les bonnes données peut devenir trop exigeant;)
Petter Brodin
-1

bien que cela soit répondu, je pensais que ce serait bien de supprimer cette petite ligne de code qui fait exactement le filtrage que la plupart des gens veulent et désactive AUTO_SHRINK:

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