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

如何通过Azure DevOps CICD用Terraform部署Azure SQL SSDT数据库对象

Terraform部署SSDT对象到现有Azure SQL数据库实现方案

Terraform没有原生支持直接部署SSDT dacpac文件的内置资源,实际使用中主流的两种实现方式如下:

方案1:null_resource + sqlpackage 本地部署(轻量常用)

提前准备:本地或CI/CD代理已安装sqlpackage工具,Azure账号已完成认证且有SQL数据库的管理权限,SSDT项目已编译生成.dacpac文件。

# 定义变量
variable "sql_server_fqdn" {
  type        = string
  description = "现有Azure SQL Server的完全限定域名"
}

variable "sql_database_name" {
  type        = string
  description = "目标数据库名称"
}

variable "sql_admin_username" {
  type        = string
  description = "SQL Server管理员账号"
}

variable "sql_admin_password" {
  type        = string
  sensitive   = true
  description = "SQL Server管理员密码"
}

variable "dacpac_file_path" {
  type        = string
  default     = "./bin/Release/你的SSDT项目名.dacpac"
  description = "本地dacpac文件路径"
}

# 执行dacpac部署
resource "null_resource" "deploy_ssdt" {
  # 仅当dacpac文件内容变更时触发部署
  triggers = {
    dacpac_file_hash = filemd5(var.dacpac_file_path)
  }

  provisioner "local-exec" {
    command = <<EOT
sqlpackage /Action:Publish \
  /SourceFile:"${var.dacpac_file_path}" \
  /TargetServerName:"${var.sql_server_fqdn}" \
  /TargetDatabaseName:"${var.sql_database_name}" \
  /TargetUser:"${var.sql_admin_username}" \
  /TargetPassword:"${var.sql_admin_password}" \
  /p:BlockOnPossibleDataLoss=false
EOT
  }
}
  • 可根据业务需求调整/p:开头的发布参数,和SSDT原生发布参数完全通用,比如配置是否禁止数据丢失、是否忽略用户权限等。
  • 需确保部署端的IP已加入Azure SQL Server的防火墙白名单。

方案2:ARM模板部署(无需本地依赖,适合纯云端部署场景)

提前准备:将编译好的dacpac文件上传到Azure存储账户,生成对应文件的SAS访问令牌。

resource "azurerm_resource_group_template_deployment" "ssdt_deploy" {
  name                = "ssdt-dacpac-deployment"
  resource_group_name = "SQL Server所在资源组名称"
  deployment_mode     = "Incremental"

  template_content = <<EOF
{
  "contentVersion": "1.0.0.0",
  "parameters": {
    "serverName": { "type": "string" },
    "databaseName": { "type": "string" },
    "dacpacUri": { "type": "string" },
    "dacpacSasToken": { "type": "securestring" },
    "adminLogin": { "type": "string" },
    "adminPassword": { "type": "securestring" }
  },
  "resources": [
    {
      "type": "Microsoft.Sql/servers/databases/extensions",
      "apiVersion": "2021-11-01",
      "name": "[concat(parameters('serverName'), '/', parameters('databaseName'), '/dacpac')]",
      "properties": {
        "storageKey": "[parameters('dacpacSasToken')]",
        "storageKeyType": "SharedAccessKey",
        "storageUri": "[parameters('dacpacUri')]",
        "administratorLogin": "[parameters('adminLogin')]",
        "administratorLoginPassword": "[parameters('adminPassword')]",
        "operationMode": "Import"
      }
    }
  ]
}
EOF

  parameters_content = jsonencode({
    serverName         = "你的SQL Server名称(不含.database.windows.net后缀)"
    databaseName       = var.sql_database_name
    dacpacUri          = "存储账户中dacpac文件的访问地址"
    dacpacSasToken     = { value = "dacpac文件对应的SAS令牌" }
    adminLogin         = var.sql_admin_username
    adminPassword      = { value = var.sql_admin_password }
  })
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 02:15:04