Comment nommer les noms de files d'une database et définir son location dans le projet de database Visual Studio 2015?

En sélectionnant "Publier" dans le menu contextuel d'un projet de database VS 2015, je peux créer un script qui contient toutes les commands nécessaires pour déployer la database sur le server SQL ("xyz.publish.sql").

Le nom de la database et ses paths dans ce script sont déclarés en tant que variables:

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

aussi les noms de files semblent être générés 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 paths et les noms de files? Je ne veux pas que "_Primary" soit attaché aux noms de files et les paths ont besoin d'un sous-dossier supplémentaire.

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

Vous pouvez append un script de pré-deployment au projet qui détache la database, déplace / renomme les files, puis rattache la database en utilisant les nouveaux files.

 -- 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 à ce sujet:

  • J'ai codé en dur C: \ comme le nouvel location pour les files pour plus de simplicité. Il vaut mieux créer une variable SQLCMD pour stocker ce path.
  • Si xp_cmdshell 'MOVE ... échoue, il le fera en silence. 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 Comment capturer la sortie d'erreur de xp_cmdshell dans SQL Server .
  • Vous pouvez rencontrer des problèmes de permissions avec la command xp_cmdshell 'MOVE ... . Dans ce cas, vous devrez peut-être ajuster les permissions des paths d'access source et cible dans l'instruction MOVE. Vous pouvez également avoir besoin d'exécuter la command en tant qu'user différent – voir ici (section Autorisations) ou ici pour les débutants.

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 locations dans lesquels SQL Server utilisera ceux par défaut pour l'instance – mais cela implique aussi de changer le script.