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_files instanzweit ist).

  • Berechtigungen: Benötigt VIEW ANY DATABASE (in der Regel Mitglied in public-Rolle, die standardmäßig diese Sicht sehen darf). Für DATABASEPROPERTYEX sind 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 DISTINCT bzw. 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 (weil LEFT(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