如何在CI流水线中用Redgate SQL Source Control脚本初始化SQL Server数据库
从Redgate SQL Source Control脚本构建CI测试数据库的解决方案
问题背景
我有一个由Redgate SQL Source Control生成的SQL脚本文件夹,想在CI服务器上创建新的SQL Server数据库用于集成测试。已经能轻松创建SQL Server Docker容器,但需要创建所有表、函数等对象。想用Redgate SSC生成的脚本,但不知道怎么在流水线中运行——手动执行时因为对象间有依赖,得按特定顺序来,操作起来很麻烦。
更新:目前正在研究《直接从对象级源脚本构建数据库》方案。
可行解决方案
1. 用Redgate命令行工具自动处理依赖
Redgate SQL Source Control配套的SQL Compare Command Line工具能自动分析对象依赖,按正确顺序执行脚本,完美适配CI流水线:
- 在CI服务器安装SQL Compare Command Line工具
- 编写命令行脚本,指定源脚本文件夹和目标Docker数据库,执行同步:
该命令会自动生成并执行符合依赖顺序的部署脚本,直接完成所有对象的创建。sqlcompare /Source:"C:\YourScriptsFolder" /Target:"Data Source=docker-sql;Initial Catalog=TestDB;Integrated Security=True" /Sync /Quiet
2. 手动排序脚本批量执行(无工具授权场景)
如果不想用Redgate工具,可以按依赖优先级手动整理脚本执行顺序:
- 先执行自定义类型、标量函数等基础对象
- 再执行表对象:先建无外键依赖的表,再建带外键的表;或者先建所有表结构,再单独执行外键创建脚本
- 最后执行视图、存储过程、触发器等依赖表的对象
- 用PowerShell或Batch脚本批量执行,示例PowerShell代码:
# 按预设依赖顺序指定脚本路径 $sqlFilePaths = @( "Schema\Types\*.sql", "Schema\Tables\*.sql", "Schema\ForeignKeys\*.sql", "Schema\Views\*.sql", "Schema\StoredProcedures\*.sql" ) # 循环执行所有脚本 foreach ($path in $sqlFilePaths) { Get-ChildItem -Path $path | ForEach-Object { sqlcmd -S docker-sql -d TestDB -E -i $_.FullName } }
3. 落地《直接从对象级源脚本构建数据库》方案
这个方案可以用SQL Server官方的sqlpackage.exe(DAC工具)实现,自动处理依赖:
- 第一步:从脚本文件夹生成DAC包
sqlpackage.exe /Action:Build /SourcePath:"C:\YourScriptsFolder" /OutputPath:"TestDB.dacpac" - 第二步:将DAC包部署到Docker中的SQL Server数据库
DAC包会内置对象依赖逻辑,确保部署顺序完全正确。sqlpackage.exe /Action:Publish /SourceFile:"TestDB.dacpac" /TargetConnectionString:"Data Source=docker-sql;Initial Catalog=TestDB;Integrated Security=True"
内容的提问来源于stack exchange,提问作者Maxim Tkachenko
相关产品推荐
相关产品推荐

