如何在 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
第一个选项是最可取的,并且每一种方法都会变得更糟。
设置:
我有一个 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
第一个选项是最可取的,并且每一种方法都会变得更糟。