You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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数据库
    sqlpackage.exe /Action:Publish /SourceFile:"TestDB.dacpac" /TargetConnectionString:"Data Source=docker-sql;Initial Catalog=TestDB;Integrated Security=True"
    
    DAC包会内置对象依赖逻辑,确保部署顺序完全正确。

内容的提问来源于stack exchange,提问作者Maxim Tkachenko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 10:12:48