【问题标题】:Sqlproj: Which solution to deploy a database in command line?Sqlproj:在命令行中部署数据库的哪种解决方案?
【发布时间】:2015-04-10 16:51:39
【问题描述】:

我目前正在使用 Microsoft Web 部署技术(msbuild 和 msdeploy 命令)将网站部署到服务器。该网站需要部署一个数据库,并且两者都将在同一台服务器中。我正在寻找部署数据库项目的最佳解决方案(使用命令行),我想更好地了解有关数据库部署的所有技术。

解决方案的内容(Visual Studio 2013):

  • 一个数据库项目(用于 SQL Server 2008),
  • 类库(NHibernate 的数据访问层)
  • 一个 Web 项目 (ASP.NET MVC4)。

注意:我不是自愿在 VS 中使用持续集成/交付工具或发布方法。我对这个项目的第一个目标是了解 msbuild / msdeploy 的工作原理......

我查看了vsdbcmd 命令,它似乎完成了我想要的所有步骤......除了我需要将 Visual Studio DLL/文件导入我的远程服务器,我想知道是否没有更好的方法。 .. 我还查看了 msdeploy 提供程序dbSqlPackage/dbDacFx,但据我了解,它使用 dacpac 来应用架构更改。同样,SqlPackage.exe 似乎也使用了 dacpac。

使用 dacpac 听起来不错,但我对以下问题感到困惑:

  • 这是否意味着我在第一次创建数据库时需要一个不同的进程?如果是,哪个命令最好?
  • 是否可以从我的 sqlproj 文件创建 dacpac?如果是,怎么做?

根据您的经验和项目,还有其他从命令行进行部署的方法吗?部署此类项目的最佳方法是什么?

非常感谢,

【问题讨论】:

    标签: deployment msdeploy vsdbcmd sqlproj sqlpackage


    【解决方案1】:

    通过进一步研究,我发现 Visual Studio 在构建 sqlproj 时正在创建 dacpac(bin/Debug 或 bin/Release,具体取决于您的构建配置)。第一次部署时,dacpac 会创建您的数据库。当您进行架构更改时,它似乎会应用它们。

    这里总结了网站和数据库的命令行:

    网站建设

    msbuild %fullpathwebcsproj% /P:Configuration=Release /T:Package
    

    网站部署(默认应用程序池)

    msdeploy -verb:sync -source:package=%fullpathpackage% -dest:auto
    

    %fullpathpackage%:/T:Package 存在时msbuild创建的zip文件的路径(bin/Release)

    数据库构建:

    msbuild %fullpathsqlproj% /P:Configuration=Release 
    

    数据库部署:

    msdeploy -verb:Sync -Source:dbDacFx=%fullpathdacpac% -Dest:dbDacFx=%connectionstring%
    

    这个解决方案现在让我很满意。尽管如此,我仍然对 cme​​ts 和改进建议持开放态度。

    【讨论】:

    • 当您说“第一次部署时,dacpac 会创建您的数据库。当您进行架构更改时,它似乎会应用它们。”,您的意思是您部署了数据库吗?
    • 是的,我就是这个意思。
    【解决方案2】:

    好的,一个 .sqlproj 文件被编译成一个 dacpac 文件,该文件基本上是一个 zip 文件,其中包含任何部署前/后的文件和一个包含所有 sql 脚本(模型)内容的 xml 文件。

    当您使用 msbuild 时,它使用 DacFx api 来比较 dacpac 中的更改并将其发布到 sql 数据库。

    您可以使用 msbuild,也可以自己使用 DacFx api,或者通常人们使用 sqlpackage.exe 来获取 dacpac 并与数据库进行比较,然后它可以生成脚本以便您可以手动运行它,也可以运行它生成的用于更新数据库的脚本。

    您可以使用 sqlpackage 执行其他操作,例如生成部署报告,其中包含如果被要求会更改的所有内容。

    您通过构建项目生成一个 dacpac,它将在您的输出目录中。

    它是幂等的,这意味着无论它运行多少次,在第一个实例之后它总是以相同的结果结束 - 所以每次你更改代码时,构建 dacpac 并部署它 - 如果数据库没有如果存在,那么它将被创建,如果它确实存在,它将只是部署更改。

    【讨论】:

      猜你喜欢
      • 2011-08-21
      • 1970-01-01
      • 2011-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多