Dieses Skript trennt alle Datenbanken auf einem Server. Nützlich für Migrationen
Hinweise für die Verwendung
-
Ausführen in der master-Datenbank (oder einer beliebigen Datenbank, da
sys.master_filesinstanzweit ist). -
Berechtigungen: Benötigt
VIEW ANY DATABASE(in der Regel Mitglied inpublic-Rolle, die standardmäßig diese Sicht sehen darf). FürDATABASEPROPERTYEXsind keine besonderen Rechte nötig. -
Keine automatische Ausführung – das Skript generiert nur Text. Um die Befehle tatsächlich auszuführen, müsste man die Ausgabe kopieren oder dynamisches SQL verwenden (mit Vorsicht).
-
Fallstricke:
-
Wenn eine Datenbank Dateien auf mehreren Laufwerken hat, erscheint sie nur einmal in der Liste (durch
DISTINCTbzw.GROUP BY). -
Wenn eine Datenbank offline oder verdächtig ist, wird sie nicht aufgelistet – das ist gewünscht.
-
Bei UNC-Pfaden (
\\server\share\...) schlägt die Filterung nach Laufwerksbuchstaben fehl (weilLEFT(physical_name,1)dann\liefert). Für UNC-Pfade müsste die Logik erweitert werden.
-
-- =====================================================================
-- Zweck: Generiert T-SQL-Befehle zum Abtrennen (sp_detach_db) aller
-- Benutzerdatenbanken, deren Dateien sich auf den Laufwerken
-- E: oder F: befinden. Die Datenbank muss ONLINE sein.
-- Systemdatenbanken (master, tempdb, msdb, model) werden ausgeschlossen.
--
-- Warnung: Die generierten Befehle führen kein sofortiges Detach aus.
-- Sie dienen zur Vorbereitung oder Dokumentation.
-- Vor der Ausführung sicherstellen, dass die Datenbank nicht
-- aktiv genutzt wird (keine Verbindungen, keine laufenden Jobs).
--
-- Hinweis: Nur Laufwerksbuchstaben werden unterstützt (keine UNC-Pfade).
-- Für benannte Instanzen funktioniert die Abfrage ebenfalls, da
-- sys.master_files instanzspezifisch ist.
-- =====================================================================
SELECT DISTINCT
'exec sp_detach_db ''' + DB_NAME(database_id) + ''';' AS DetachCommand
FROM sys.master_files
WHERE
-- Laufwerk E: oder F: (erster Buchstabe des physischen Pfades)
LEFT(physical_name, 1) IN ('E', 'F')
-- Nur Datenbanken, die online sind
AND DATABASEPROPERTYEX(DB_NAME(database_id), 'Status') = 'ONLINE'
-- Keine Systemdatenbanken
AND DB_NAME(database_id) NOT IN ('master', 'tempdb', 'msdb', 'model')
ORDER BY
DB_NAME(database_id); -- Alphabetische Sortierung der Befehle