【问题标题】:How to generate SSDT change script using MSBuild in CI environment?如何在 CI 环境中使用 MSBuild 生成 SSDT 更改脚本?
【发布时间】:2021-11-15 17:13:52
【问题描述】:

设置:
我有一个 Visual Studio 2019 .Net 解决方案,其中有一个 SSDT 项目。

目标:
我需要在每个 CI 构建 (TFS) 上自动生成一个 sql 更改脚本,以便进一步包含它来构建用于分发的工件。

我知道有 sqlpackage.exe 工具可以生成更改脚本,但它需要现有的数据库连接或 *.dacpac 文件进行比较。

是否有一种标准方法可以在每次 CI 构建时自动生成 sql 更改脚本?

更新:

示例:

我的 sql 项目的版本 #1:

MyProject\Schema Objects\Schemas\dbo\Tables\MyTable.sql:

CREATE TABLE [dbo].[MyTable] (
    [Id] INT IDENTITY (1, 1) NOT NULL,
    [Name] VARCHAR (50) NOT NULL,
);

我的 sql 项目的版本 #2:

MyProject\Schema Objects\Schemas\dbo\Tables\MyTable.sql:

CREATE TABLE [dbo].[MyTable] (
    [Id] INT IDENTITY (1, 1) NOT NULL,
    [Name] VARCHAR (50) NOT NULL,
    [Description] VARCHAR (255) NOT NULL,
);

MyProject\Schema Objects\Schemas\dbo\Programmability\Stored Procedures\MyProcedure.sql

CREATE PROCEDURE [dbo].[MyProcedure]
BEGIN
...
...
END

我现在可以生成的脚本:

CREATE DATABASE
...
...
CREATE TABLE MyTable
...
...
CREATE PROCEDURE MyProcedure
...
...

我需要的脚本(更改脚本,仅包含相对于以前版本所做的更改):

ALTER TABLE [dbo].[MyTable] 
ADD [Description] VARCHAR (255) NOT NULL

GO

ALTER PROCEDURE MyProcedure
...
...

GO

【问题讨论】:

  • 似乎没有使用MSBuild自动生成sql更改脚本的标准方法。
  • @Tianyu 你可以在本地做到这一点

标签: visual-studio msbuild sql-server-data-tools


【解决方案1】:

msbuild.exe $SqlProjPath /p:SqlPublishProfilePath=$SqlPublishProfilePath /p:UpdateDatabase=false /t:Build,Publish 其中最重要的参数是UpdateDatabase,当它是false 时,它只会生成脚本而不发布

更新(基于 cmets):据我了解,希望避免与数据库的连接。这实际上不是推荐的方法,因为通常您不能 100% 确定当前生产的数据库的确切版本(或您要部署到的任何环境),因为可能有数百万个原因导致它漂移,通常是因为直接对数据库进行一些手动更改。这就是为什么建议与它进行比较的原因。无论如何,在使用 SSDT 时,您总是需要一些数据库或 dacpac 进行比较。所以,这些是我可以看到的选项:

  • 与真实数据库比较
  • 从真实数据库中提取 dacpac 并与之比较
  • 从源代码管理中检查以前的项目版本,构建项目并将当前状态与构建的 dacpac 进行比较
  • 在版本控制中保存上次部署的 dacpac 并使用它进行比较。部署后提交新版本的 dacpac

第一个选项是最可取的,并且每一种方法都会变得更糟。

【讨论】:

  • Dmitrij,感谢您的详细回答!恐怕我的问题问得不够正确,所以我用一个例子更新了它。
  • “以前的”版本在哪里?
  • 它位于git仓库中,所有脚本都在git版本控制下
  • 但是前一个是什么?以前的提交还是什么?
  • @DmitryMishin 更新了答案
猜你喜欢
  • 1970-01-01
  • 2012-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-29
  • 2018-07-05
  • 1970-01-01
相关资源
最近更新 更多