Как назвать имена файлов базы данных и установить ее местоположение в проекте базы данных Visual Studio 2015?

Выбрав «Опубликовать» в контекстном меню проекта базы данных VS 2015, я могу создать скрипт, содержащий все необходимые команды для развертывания базы данных на SQL Server («xyz.publish.sql»).

Имя базы данных и пути к ней в этом скрипте объявлены как переменные:

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

также имена файлов, кажется, генерируются автоматически:

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

Где я могу установить пути и имена файлов? Я не хочу, чтобы «_Primary» прикреплялся к именам файлов, а для путей нужна дополнительная подпапка.

Если я изменю сценарий публикации, мои изменения, вероятно, будут перезаписаны в следующий раз, когда этот сценарий будет сгенерирован Visual Studio.


person Michael Bayer    schedule 19.08.2015    source источник


Ответы (2)


Вы можете добавить в проект сценарий перед развертыванием, который отсоединяет базу данных, перемещает/переименовывает файлы, а затем повторно подключает базу данных, используя новые файлы.

-- 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

Некоторые примечания по этому поводу:

  • Для простоты я жестко запрограммировал C:\ в качестве нового места для файлов. Вам лучше создать переменную SQLCMD для хранения этого пути.
  • Если xp_cmdshell 'MOVE ... выйдет из строя, он сделает это молча. Чтобы мой ответ был простым, я не включил проверку ошибок, но вы можете выполнить свою собственную проверку, просто вставив результаты xp_cmdshell во временную таблицу. См. раздел , как перехватить ошибку. вывод из xp_cmdshell в SQL Server.
  • У вас могут возникнуть проблемы с правами доступа к команде xp_cmdshell 'MOVE .... В этом случае вам может потребоваться настроить разрешения исходного и целевого путей в операторе MOVE. Вам также может потребоваться запустить команду от имени другого пользователя — см. здесь (раздел "Разрешения") или здесь для начала.
person Keith    schedule 19.08.2015
comment
Спасибо. Я решил это по-вашему несколько минут назад, но добавил скрипт после развертывания и использовал ALTER Database... FILENAME=.... - person Michael Bayer; 19.08.2015

Да, они будут изменены, но это так. Вы должны изменить сценарий. Другая вещь, которую вы можете сделать, это не указывать места, в которых SQL Server будет использовать места по умолчанию для экземпляра, но это также требует изменения сценария.

person simon at rcl    schedule 19.08.2015