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

 

 

Cookies user preferences
We use cookies to ensure you to get the best experience on our website. If you decline the use of cookies, this website may not function as expected.
Accept all
Decline all
Analytics
Tools used to analyze the data to measure the effectiveness of a website and to understand how it works.
Google Analytics
Advertisement
If you accept, the ads on the page will be adapted to your preferences.
Google Ad
Save