如何在 CI 环境中使用 MSBuild 生成 SSDT 更改脚本?

How to generate SSDT change script using MSBuild in CI environment?

设置:
我有一个 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.exe $SqlProjPath /p:SqlPublishProfilePath=$SqlPublishProfilePath /p:UpdateDatabase=false /t:Build,Publish 其中最重要的参数是 UpdateDatabase 而当它是 false 时,它只会生成脚本而不发布

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

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

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