2015-08-19 1 views
3

En sélectionnant "Publier" dans le menu contextuel d'un projet de base de données VS 2015, je peux créer un script qui contient toutes les commandes nécessaires pour déployer la base de données sur le serveur SQL ("xyz.publish.sql").Comment nommer les noms de fichiers d'une base de données et définir son emplacement dans le projet de base de données Visual Studio 2015?

Le nom de base de données et ses chemins dans ce script sont déclarées comme variables:

:setvar DatabaseName "myDatabase" 
:setvar DefaultFilePrefix "myDatabase" 
:setvar DefaultDataPath "D:\Databases\" 
:setvar DefaultLogPath "D:\Databases\" 

aussi les noms de fichiers semble être généré automatiquement:

PRIMARY(NAME = [$(DatabaseName)], FILENAME = N'$(DefaultDataPath)$(DefaultFilePrefix)_Primary.mdf') 
LOG ON (NAME = [$(DatabaseName)_log], FILENAME = N'$(DefaultLogPath)$(DefaultFilePrefix)_Primary.ldf')... 

Où puis-je définir les chemins et les noms de fichiers ? Je ne veux pas que "_Primary" soit attaché aux noms de fichiers et les chemins ont besoin d'un sous-dossier supplémentaire.

Si je change dans le script de publication, mes modifications seront probablement remplacées la prochaine fois que ce script sera généré par Visual Studio.

Répondre

1

Vous pouvez ajouter au script un script de pré-déploiement qui détache la base de données, déplace/renomme les fichiers, puis rattache la base de données à l'aide des nouveaux fichiers.

-- detach db before moving physical files 
USE [master] 
GO 
exec sp_detach_db @dbname = N'$(DatabaseName)' 
GO 

-- enable xp_cmdshell 
exec sp_configure 'show advanced options', 1 
GO 
RECONFIGURE 
GO 
exec sp_configure 'xp_cmdshell', 1 -- 0 = Disable , 1 = Enable 
GO 
RECONFIGURE 
GO 

-- move physical files 
EXEC xp_cmdshell 'MOVE "$(DefaultDataPath)$(DefaultFilePrefix)_Primary.mdf", "C:\$(DatabaseName)\$(DatabaseName).mdf"' 
EXEC xp_cmdshell 'MOVE "$(DefaultLogPath)$(DefaultFilePrefix)_Primary.ldf", "C:\$(DatabaseName)\$(DatabaseName)_log.ldf"' 
GO 

-- reattach db with new filepath 
CREATE DATABASE [$(DatabaseName)] ON 
(NAME = [$(DatabaseName)], FILENAME = 'C:\$(DatabaseName)\$(DatabaseName).mdf'), 
(NAME = [$(DatabaseName)_log], FILENAME = 'C:\$(DatabaseName)\$(DatabaseName)_log.ldf') 
FOR ATTACH 
GO 

-- disable xp_cmdshell 
exec sp_configure 'show advanced options', 1 
GO 
RECONFIGURE 
GO 
exec sp_configure 'xp_cmdshell', 0 -- 0 = Disable , 1 = Enable 
GO 
RECONFIGURE 
GO 

USE [$(DatabaseName)]; 
GO 

Quelques notes sur ce point:

  • I C codés en dur: \ comme nouvel emplacement pour les fichiers de simplicité. Il vaut mieux créer une variable SQLCMD pour stocker ce chemin. Si xp_cmdshell 'MOVE ... échoue, il le fera silencieusement. Pour garder ma réponse simple, je n'ai inclus aucune vérification d'erreur, mais vous pouvez rouler la vôtre en insérant simplement les résultats de xp_cmdshell dans une table temporaire. Voir How to capture the error output from xp_cmdshell in SQL Server. Vous pouvez rencontrer des problèmes de permissions avec la commande xp_cmdshell 'MOVE .... Dans ce cas, vous devrez peut-être ajuster les autorisations des chemins d'accès source et cible dans l'instruction MOVE. Vous devrez peut-être exécuter la commande en tant qu'utilisateur différent - voir here (Permissions section) ou here pour les débutants.
+0

Merci. J'ai résolu le problème il y a quelques minutes, mais j'ai ajouté un script de post-déploiement et j'ai utilisé "ALTER Database ... FILENAME = ...". –

0

Oui, ils seront changés mais c'est ainsi que ça fonctionne. Vous devez changer le script. L'autre chose que vous pouvez faire est de ne pas spécifier les emplacements dans lesquels SQL Server utilisera ceux par défaut pour l'instance - mais cela implique aussi de changer le script.