Déplacer des bases de données SQL Server vers un nouveau volume — que ce soit pour rééquilibrer les I/O entre les stockages, migrer vers des disques plus rapides ou récupérer de l’espace — nécessite une approche méthodique pour éviter les surprises de temps d’arrêt. La méthode détacher/attacher est l’option la plus rapide quand vous pouvez vous permettre une brève fenêtre hors ligne : pas de sauvegarde impliquée, pas de surcharge de transfert réseau. Ce metascript génère les instructions complètes de détachement, déplacement de fichiers et ré-attachement pour chaque base de données à déplacer.
Quand utiliser Détacher/Attacher vs Sauvegarde/Restauration
- Détacher/Attacher : le plus rapide, pas d’espace disque supplémentaire nécessaire, mais nécessite que la base soit hors ligne. Idéal pour les déplacements de volumes locaux sur le même serveur.
- Sauvegarde/Restauration : plus flexible, fonctionne entre serveurs et réseaux, la source reste en ligne. Mieux pour les migrations entre instances.
- ALTER DATABASE … MODIFY FILE : opération en ligne, sans temps d’arrêt — mais nécessite un redémarrage du service. Idéal pour la planification future quand vous ne pouvez pas vous permettre de temps d’arrêt.
Ce que le script génère
Pour chaque base de données sélectionnée, le script produit trois sections : l’instruction de détachement (avec SINGLE_USER pour terminer les connexions actives), les commandes de déplacement de fichiers au niveau OS via xp_cmdshell, et l’instruction de ré-attachement avec tous les chemins de fichiers de données mis à jour vers la nouvelle destination. Utilisez ALT+T dans SSMS pour avoir les résultats en texte avant d’exécuter.
SET NOCOUNT ON
----------------------------------------------------
-- CONFIGUREZ ICI
----------------------------------------------------
-- Chemin destination des fichiers de données
DECLARE @pathdata NVARCHAR(MAX) = 'D:DataPath'
-- Chemin destination des fichiers de journaux
DECLARE @pathlog NVARCHAR(MAX) = 'L:LogPath'
----------------------------------------------------
-- LISTE DES BASES DE DONNÉES
-- Pour déplacer TOUTES les bases utilisateur,
-- décommentez l'INSERT ci-dessous
----------------------------------------------------
CREATE TABLE #dbs (dbname NVARCHAR(255))
--INSERT INTO #dbs VALUES ('db1')
--INSERT INTO #dbs VALUES ('db2')
-- INSERT INTO #dbs SELECT name FROM sys.databases
-- WHERE database_id > 4 -- exclure les bases système
Le script génère ensuite pour chaque base : l’instruction ALTER DATABASE SET SINGLE_USER, sp_detach_db, les commandes xp_cmdshell pour les copies de fichiers, et CREATE DATABASE ... FOR ATTACH avec les nouveaux chemins.








