从Azure DevOps管道运行架构比较以更新SQL数据库项目



我们有一个SQL数据库项目,用于将更改部署到TEST和PROD环境中。白天,开发人员直接对DEV数据库进行更改(不要使用数据库项目(。定期在数据库项目中进行架构比较,以收集开发人员在DEV数据库中所做的所有更改,以便通过Azure发布管道将其应用于TEST环境。

这一切在Azure Pipelines中都很有效,但我们希望创建一个管道,自动运行DEV数据库之间的架构比较,并将更改应用于数据库项目(我们必须手动执行(。几年前,我对此进行了研究,但命令行不支持将数据库项目作为模式比较的目标。有人知道现在这种工作流程是否可行吗?

正如Daniel所提到的,在没有数据库项目的情况下使用开发环境不是一个好主意。然而,在某些情况下,由于沙箱价格、测试数据或任何其他限制,我们不得不在公共数据库中工作。在这种情况下,太复杂了,无法检查DEV数据库何时准备好同步更改,因为它可能包含原始更改。考虑使用该过程:您的开发人员在源代码管理下向数据库项目添加更改。他们可以直接更改DEV数据库,但每个开发人员只将其工作范围提交给源代码管理。在这种情况下,您可以在源代码管理中看到每个用户故事和bug的更改,并在需要时将它们链接到相应的工作项。此外,您可以添加一个集成数据库来检查新更改的一致性:

DEV (manually + commit to SC)->INT (pipelines CI/CD)->TEST->PROD

作为附加想法:

  1. 您可以尝试创建一个Coded UI测试或Selenim测试来按下VS上的按钮并更新您的数据库项目。然后,您可以将其添加到管道中,并每晚更新您的SC
  2. CCD_ 5生成更新脚本CCD_;DacPac file。但是,没有办法将其应用于数据库项目

我同意Daniel的观点,应该避免直接在DEV数据库中运行数据库更改。在这种情况下,您可以尝试使用sql脚本作为示例:

set nocount on;
-- Set the two variables newmodel and oldmodel to the appropriate database names and execute the script
declare @newmodel varchar(50), @oldmodel varchar(50);
Set @newmodel = '[NewModel to Compare]';
set @oldmodel = '[OldModel to Compare]';

Declare @Temp table (TABLE_SCHEMA varchar(40), TABLE_NAME varchar(40), COLUMN_NAME varchar(50), ORDINAL_POSITION int, IS_NULLABLE varchar(5), NullChange varchar(5), Comment varchar(50));
Declare @script varchar(5000);

set @script = '
Select nc.TABLE_SCHEMA, nc.TABLE_NAME, nc.COLUMN_NAME, nc.ORDINAL_POSITION, nc.IS_NULLABLE, IIF(nc.IS_NULLABLE <> oc.IS_NULLABLE, ''Yes'', ''No''), 
IIF(oc.COLUMN_NAME IS NULL, convert(varchar(20), ''ADDED COLUMN''), convert(varchar(20), ''--'')) as Comment
from {NEW}.INFORMATION_SCHEMA.COLUMNS nc
LEFT join {OLD}.INFORMATION_SCHEMA.COLUMNS oc 
on nc.TABLE_NAME = oc.TABLE_NAME and nc.COLUMN_NAME = oc.COLUMN_NAME
UNION ALL
Select oc.TABLE_SCHEMA, oc.TABLE_NAME, oc.COLUMN_NAME, oc.ORDINAL_POSITION, oc.IS_NULLABLE, ''No'', ''DELETED COLUMN'' as Comment
from {OLD}.INFORMATION_SCHEMA.COLUMNS oc
where CONCAT(oc.TABLE_NAME, ''.'', oc.COLUMN_NAME) 
not in (Select CONCAT(TABLE_NAME, ''.'', COLUMN_NAME) from {NEW}.INFORMATION_SCHEMA.COLUMNS)
';

Set @script = replace(@script, '{OLD}', @oldmodel);
Set @script = replace(@script, '{NEW}', @newmodel);
--print @script
Insert into @Temp
exec(@script);
Select * from @Temp where Comment <> '--'
order by TABLE_NAME, ORDINAL_POSITION, COLUMN_NAME;
go

最新更新