【问题标题】:How to name the filenames of a database and set its location in Visual Studio 2015 Database project?如何命名数据库的文件名并在 Visual Studio 2015 数据库项目中设置其位置?
【发布时间】:2015-08-19 09:18:50
【问题描述】:

通过在 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 生成此脚本时被覆盖。

【问题讨论】:

    标签: sql-server visual-studio database-project


    【解决方案1】:

    您可以将预部署脚本添加到项目中,以分离数据库、移动/重命名文件,然后使用新文件重新附加数据库。

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

    【讨论】:

    • 谢谢。几分钟前我以你的方式解决了它,但添加了一个部署后脚本并使用“ALTER Database ... FILENAME = ...”。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-08
      • 1970-01-01
      • 2020-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多