SQL 專案自動化

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控實例

本文概述了不同軟體交付平台上 SQL 專案的自動化選項。 利用自動化將 SQL 資料庫專案整合進 CI/CD 管線,並持續且反覆部署資料庫變更。

要自動化什麼

SQL 專案自動化通常包含 CI/CD 流程中的兩個關鍵任務:

  • 建置 SQL 專案:驗證專案並透過執行 dotnet build SQL 資料庫專案來編譯部署工件.dacpac()。 可選擇性執行 程式碼分析 規則,在專案建置時檢查程式碼品質。

  • 部署 : .dacpac使用 SqlPackage 或平台特定任務發佈到 .dacpac 目標資料庫。 部署可針對 Azure SQL 資料庫、Azure SQL 管理實例、SQL Server 或 Fabric 中的 SQL 資料庫。

圖表顯示從 SQL 專案建置到 dacpac 產物,再部署到資料庫的流程。

當你將這些步驟整合進你的 CI/CD 管線時,資料庫變更會在每次提交時被驗證,並在不同環境中一致部署。

常見概念

工件流程:典型的管線將建置階段與部署階段分隔開來。 建置階段會編譯 SQL 專案並產生檔案 .dacpac ,然後以管線工件形式發佈。 在後續部署工作中(可能經過人工核准後),產物會被下載並部署到目標資料庫。 這種分離讓你只需建置一次,就能將同一件工件部署到多個環境,確保一致性。

發佈或腳本:在部署到敏感環境前,您可以先檢視部署計畫。 SqlPackage 支援一個 Script 動作,在部署期間產生 T-SQL 腳本,無需套用變更。 所提供的 T-SQL 腳本允許資料庫管理員或審查者檢視套用 .dacpac 事前核准所需的具體變更。 同樣地,該 DeployReport 動作會產生一份計畫變更的 XML 報告。

環境核准與閘門:生產部署通常需要核准工作流程以防止非預期變更。 GitHub Actions 和 Azure DevOps 都支援基於環境的核准。 在 GitHub 裡, 你可以設定環境 ,並設定必要的審查器和等待計時器。 在 Azure DevOps 中, 環境 支援批准門檻、營業時間限制及其他部署控制。 這些控管措施有助於確保資料庫變更在正式上線前經過審查與核准。

先決條件

SqlPackage 支援跨平台,並可在 Windows、Linux 及 macOS 上運行。 安裝為 .NET 全域工具,以確保各環境行為一致。

  • .NET SDK 安裝在建置代理程式上。

  • 在建置代理程式上安裝了 SqlPackage。 你可以將 SqlPackage 安裝為 .NET 全域工具:

    dotnet tool install --global microsoft.sqlpackage
    

軟體交付平台

選擇符合團隊工具、合規性及連線需求的環境。

受控虛擬環境

Microsoft 管理的虛擬環境用於 GitHub Actions 託管運行程式與 Azure Pipelines 代理,包含預先安裝的工具:

環境 .NET SDK SqlPackage
Windows 作業系統 Preinstalled Preinstalled
Linux Preinstalled 不是預裝的
macOS Preinstalled 不是預裝的

在 Linux 和 macOS 環境中,將 SqlPackage 作為工作流程的一部分安裝。 欲了解更多關於管線中 SqlPackage 安裝與版本控制的資訊,請參見 開發管線中的 SqlPackage

自架環境

當你需要對環境有更多控制時,請從自架運行者或代理程式部署,例如:

  • 網路隔離要求(存取未暴露於公共網際網路的資料庫)
  • 自訂工具或特定 SqlPackage 版本
  • 合規或安全政策

你可以部署自架運行者作為 Azure 容器應用的工作 ,以執行事件驅動、無伺服器的執行。 使用此方法在 Dockerfile 中定義環境,並依需求安裝 SqlPackage 及其他工具。

GitHub Actions

Azure SQL 部署動作azure/sql-action)提供整合體驗,讓可從任何 GitHub Actions 執行器部署 SQL 專案與.dacpac檔案至 Azure SQL 與 SQL Server。

主要功能:

  • 部署 .dacpac.sqlproj.sql 腳本。
  • 支援 SQL 認證、Microsoft Entra ID 認證及服務主體認證。
  • 結合 Azure SQL 資料庫 azure/login時,會自動新增或移除臨時防火牆規則。
  • 在 Windows 和 Linux 運行程式上都能運作。

範例:部署一個使用 GitHub Actions 的 SQL 專案

# .github/workflows/sql-deploy.yml
on: [push]

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4

    - uses: azure/sql-action@v2
      with:
        connection-string: ${{ secrets.AZURE_SQL_CONNECTION_STRING }}
        path: './Database.sqlproj'
        action: 'publish'

對於需要臨時防火牆規則的 Azure SQL 資料庫部署,請在 以下步驟sql-action前加:azure/login

    - uses: azure/login@v2
      with:
        creds: ${{ secrets.AZURE_CREDENTIALS }}

    - uses: azure/sql-action@v2
      with:
        connection-string: ${{ secrets.AZURE_SQL_CONNECTION_STRING }}
        path: './Database.dacpac'
        action: 'publish'

你也可以直接在任何執行線上使用 SqlPackage。 欲了解更多資訊,請參閱 開發流程中的 SqlPackage

Azure Pipelines

Azure DevOps 提供 SqlAzureDacpacDeployment 任務,用於將 .dacpac 檔案和 SQL 腳本部署到 Azure SQL 資料庫。

主要功能:

  • 部署 .dacpac 檔案或執行 SQL 腳本。
  • 支援 SQL 認證、Microsoft Entra ID 認證及服務主體認證。
  • 自動管理 Azure SQL 資料庫的防火牆規則。
  • 需要 Windows 代理程式(直接在 Linux 代理程式上使用 SqlPackage)。

範例:使用 Azure DevOps 部署 a .dacpac

# azure-pipelines.yml
trigger:
  - main

pool:
  vmImage: 'windows-latest'

steps:
- task: SqlAzureDacpacDeployment@1
  inputs:
    azureSubscription: 'your-service-connection'
    AuthenticationType: 'server'
    ServerName: 'your-server.database.windows.net'
    DatabaseName: 'your-database'
    SqlUsername: '$(SqlUser)'
    SqlPassword: '$(SqlPassword)'
    deployType: 'DacpacTask'
    DeploymentAction: 'Publish'
    DacpacFile: '$(Build.ArtifactStagingDirectory)/Database.dacpac'

對於 Linux 代理程式或對部署流程有更多控制權,請直接使用 SqlPackage:

steps:
- task: UseDotNet@2
  inputs:
    packageType: 'sdk'
    version: '8.x'

- script: dotnet tool install --global microsoft.sqlpackage
  displayName: 'Install SqlPackage'

- script: |
    sqlpackage /Action:Publish \
      /SourceFile:$(Build.ArtifactStagingDirectory)/Database.dacpac \
      /TargetConnectionString:"$(ConnectionString)"
  displayName: 'Deploy database'

其他 CI/CD 平台

對於像 GitLab CI/CD、Jenkins、CircleCI 或其他平台,直接使用 SqlPackage 來建置和部署 SQL 專案。

建置專案

dotnet build ./Database.sqlproj -c Release

部署 .dacpac

sqlpackage /Action:Publish \
  /SourceFile:./bin/Release/Database.dacpac \
  /TargetConnectionString:"Server=your-server;Database=your-db;User Id=user;Password=password;"