如何命名数据库的文件名并设置其在 Visual Studio 2015 数据库项目中的位置?

How to name the filenames of a database and set its location in Visual Studio 2015 Database project?

通过在 VS 2015 数据库项目的上下文菜单中选择 "Publish",我可以创建一个脚本,其中包含将数据库部署到 SQL 服务器的所有必要命令("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 生成此脚本时,我的更改可能会被覆盖。

是的,它们会被改变,但这就是它的工作方式。你必须改变剧本。您可以做的另一件事是不指定 SQL 服务器将为实例使用默认位置的位置 - 但这也涉及更改脚本。

您可以将预部署脚本添加到分离数据库的项目,moves/renames 文件,然后使用新文件重新附加数据库。

-- 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 的结果插入到临时 table 中来自行滚动。参见 How to capture the error output from xp_cmdshell in SQL Server
  • 您可能 运行 使用 xp_cmdshell 'MOVE ... 命令遇到权限问题。在这种情况下,您可能需要在 MOVE 语句中调整源路径和目标路径的权限。您可能还需要 运行 作为不同用户执行命令——初学者请参阅 here (Permissions section) or here