如何命名数据库的文件名并设置其在 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。
通过在 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。