Deployment Sqlproj:在命令行中部署数据库的解决方案是什么?

Deployment Sqlproj:在命令行中部署数据库的解决方案是什么?,deployment,msdeploy,vsdbcmd,sqlproj,sqlpackage,Deployment,Msdeploy,Vsdbcmd,Sqlproj,Sqlpackage,我目前正在使用Microsoft Web部署技术(msbuild和msdeploy命令)将网站部署到服务器。该网站需要部署一个数据库,两者将位于同一服务器上。我正在寻找部署数据库项目的最佳解决方案(使用命令行),我想更好地了解数据库部署的所有技术 解决方案的内容(Visual Studio 2013): 数据库项目(用于SQL Server 2008) 类库(使用NHibernate的数据访问层) web项目(ASP.NET MVC4) 注意:我不是自愿在VS中使用持续集成/交付工具或发布方

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

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

  • 数据库项目(用于SQL Server 2008)
  • 类库(使用NHibernate的数据访问层)
  • web项目(ASP.NET MVC4)
注意:我不是自愿在VS中使用持续集成/交付工具或发布方法。我在该项目中的第一个目标是了解msbuild/msdeploy如何工作

我看了一下命令,它似乎完成了我想要的所有步骤。。。除了我需要将Visual Studio DLL/文件导入我的远程服务器之外,我想知道是否有更好的方法。。。我还研究了msdeployproviders/dbDacFx,但据我所知,它使用dacpac应用模式更改。类似地,SqlPackage.exe似乎也使用dacpac

使用dacpac听起来是个好主意,但我对以下问题感到困惑:

  • 这是否意味着我在第一次创建数据库时需要一个不同的进程?如果是,哪个命令最好
  • 可以从我的sqlproj文件创建dacpac吗?如果是,怎么做
从命令行、您的经验和项目来看,还有其他部署方式吗?部署此类项目的最佳方式是什么


非常感谢,

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

以下是网站和数据库的命令行摘要:

网站建设

msbuild %fullpathwebcsproj% /P:Configuration=Release /T:Package
网站部署(默认应用程序池)

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

数据库构建:

msbuild %fullpathsqlproj% /P:Configuration=Release 
msdeploy -verb:Sync -Source:dbDacFx=%fullpathdacpac% -Dest:dbDacFx=%connectionstring%
数据库部署:

msbuild %fullpathsqlproj% /P:Configuration=Release 
msdeploy -verb:Sync -Source:dbDacFx=%fullpathdacpac% -Dest:dbDacFx=%connectionstring%

这个解决方案现在让我很满意。尽管如此,我仍然愿意接受改进意见和建议。

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

以下是网站和数据库的命令行摘要:

网站建设

msbuild %fullpathwebcsproj% /P:Configuration=Release /T:Package
网站部署(默认应用程序池)

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

数据库构建:

msbuild %fullpathsqlproj% /P:Configuration=Release 
msdeploy -verb:Sync -Source:dbDacFx=%fullpathdacpac% -Dest:dbDacFx=%connectionstring%
数据库部署:

msbuild %fullpathsqlproj% /P:Configuration=Release 
msdeploy -verb:Sync -Source:dbDacFx=%fullpathdacpac% -Dest:dbDacFx=%connectionstring%

这个解决方案现在让我很满意。尽管如此,我仍然愿意接受改进意见和建议。

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

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

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

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

通过构建项目生成dacpac,它将位于输出目录中


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

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

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

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

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

通过构建项目生成dacpac,它将位于输出目录中


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

当您说“首次部署时,dacpac将创建您的数据库。当您进行模式更改时,它似乎会应用它们。”,您是说您部署了数据库吗?是的,这就是我的意思。当您说“第一次部署时,dacpac将创建您的数据库。当您进行模式更改时,它似乎会应用它们。”,您的意思是