Deaktivieren der automatischen Verkleinerung für alle SQL Server-Datenbanken. Warum funktioniert das nicht?

8

Ich dachte, ich könnte sp_MSforeachdb verwenden, um dieses Problem zu lösen, aber ich erhalte eine Fehlermeldung.

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

Wenn ich die obige Abfrage mit der PRINT-Zeile ohne Kommentar ausführe, wird eine Liste aller Datenbanken mit Ausnahme der Systemdatenbanken angezeigt. Wenn ich jedoch die Zeile ALTER DATABASE auskommentiere, werden folgende zwei Fehlermeldungen angezeigt:

Meldung 5058, Ebene 16,
Status 2, Zeile 9 Die Option 'AUTO_SHRINK' kann nicht in der Datenbank 'master' festgelegt werden.
Meldung 5058, Ebene 16,
Status 1, Zeile 9 Option 'AUTO_SHRINK' kann nicht in der Datenbank 'tempdb' festgelegt werden.

Dies scheint den Vorgang irgendwann zu unterbrechen, so dass nur einige der Datenbanken automatisch verkleinert werden.

Irgendeine Idee, wie ich das automatische Verkleinern für alle Datenbanken deaktivieren kann? Bonusfrage: Warum funktioniert mein Ansatz nicht?

Petter Brodin
quelle

Antworten:

7

Leider wird und wird die Prozedur sp_MSforeachdb immer nicht unterstützt und ist daher irgendwie unzuverlässig.

Es gibt einen Artikel über CodeProject , der zeigt, wie Datenbanken bei Verwendung dieser Datenbank gefiltert werden. Ich habe jedoch das gleiche Problem wie bei meiner lokalen 2008 R2-Installation. Das Filtern funktioniert nicht.

Unser eigener Freund Aaron hat vor einiger Zeit einen schönen Artikel über das Schreiben einer anderen und besseren Version von sp_MSforeachdb geschrieben. Siehe seinen Artikel hier . Verwenden Sie diesen SP und die Filterparameter tun, was Sie brauchen.

Marian
quelle
Das funktionierte wie ein Zauber, und es gab sogar ein Beispiel dafür, was ich erreichen wollte. Vielen Dank!
Petter Brodin
3
Wir sollten uns besser bei Aaron bedanken :-). Er hat das Drehbuch gemacht, ich habe nur schnell danach gesucht. Angenommen, ich bin in diesem Fall ein NC-Index, der auf die Clustered-Index-Blattdaten verweist, und er ist der Clustered-Index selbst :-).
Marian
1
Genau! Aber ohne richtige Indizierung kann es zu schwierig werden, die richtigen Daten zu finden;)
Petter Brodin
-1

Obwohl dies beantwortet wird, wäre es schön, diese kleine Codezeile zu löschen, die genau die Filterung ausführt, die die meisten Leute wollen, und AUTO_SHRINK auf OFF setzt:

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