Automazione dei progetti SQL

Si applica a:SQL Server, Database SQL di Azure e Istanza gestita di SQL di Azure.

Questo articolo offre una panoramica delle opzioni di automazione per i progetti SQL in diverse piattaforme di distribuzione software. Usare l'automazione per integrare i progetti di database SQL nelle pipeline CI/CD e distribuire le modifiche del database in modo coerente e ripetuto.

Cosa automatizzare

L'automazione dei progetti SQL prevede in genere due attività chiave in una pipeline CI/CD:

  • Compilare il progetto SQL: convalidare il progetto e produrre l'artefatto di distribuzione (.dacpac) eseguendo dotnet build nel progetto di database SQL da compilare. Facoltativamente, eseguire regole di analisi del codice per controllare la qualità del codice durante la compilazione del progetto.

  • Distribuire : .dacpacpubblicare in .dacpac un database di destinazione usando SqlPackage o un'attività specifica della piattaforma. La distribuzione può essere istanza di database SQL di Azure, Istanza gestita di SQL di Azure, SQL Server o database SQL in Fabric.

Diagramma che mostra il flusso dalla compilazione del progetto SQL all'artefatto dacpac e alla distribuzione in un database.

Integrando questi passaggi nella pipeline CI/CD, le modifiche al database vengono convalidate in ogni commit e distribuite in modo coerente tra gli ambienti.

Concetti comuni

Flusso degli artefatti: una pipeline tipica separa le fasi di compilazione e distribuzione. La fase di compilazione compila il progetto SQL e produce un .dacpac file, che viene quindi pubblicato come artefatto della pipeline. In un processo di distribuzione successivo (potenzialmente dopo l'approvazione manuale), l'artefatto viene scaricato e distribuito nel database di destinazione. Questa separazione consente di compilare una sola volta e distribuire lo stesso artefatto in più ambienti, garantendo la coerenza.

Pubblica o script: prima di eseguire la distribuzione in ambienti sensibili, è possibile esaminare il piano di distribuzione. SqlPackage supporta un'azione Script che genera lo script T-SQL che verrebbe eseguito durante la distribuzione, senza applicare modifiche. Lo script T-SQL fornito consente agli amministratori o ai revisori del database di esaminare le modifiche esatte necessarie per applicare l'oggetto prima dell'approvazione .dacpac . Analogamente, l'azione DeployReport genera un report XML delle modifiche pianificate.

Approvazioni e controlli dell'ambiente: le distribuzioni di produzione richiedono in genere flussi di lavoro di approvazione per evitare modifiche impreviste. Sia GitHub Actions che Azure DevOps supportano le approvazioni basate sull'ambiente. In GitHub è possibile configurare gli ambienti con revisori necessari e timer di attesa. In Azure DevOps gli ambienti supportano controlli di approvazione, restrizioni dell'orario di ufficio e altri controlli di distribuzione. Questi controlli consentono di verificare che le modifiche al database vengano esaminate e approvate prima di raggiungere la produzione.

Prerequisiti

SqlPackage è multipiattaforma ed è in esecuzione in Windows, Linux e macOS. Installarlo come strumento globale .NET per garantire un comportamento coerente tra gli ambienti.

  • .NET SDK installato nell'agente di compilazione.

  • SqlPackage installato nell'agente di compilazione. È possibile installare SqlPackage come strumento globale .NET:

    dotnet tool install --global microsoft.sqlpackage
    

Piattaforme per la distribuzione di software

Scegliere un ambiente che corrisponda ai requisiti di strumenti, conformità e connettività del team.

Ambienti virtuali gestiti

Gli ambienti virtuali gestiti da Microsoft per GitHub Actions ospitati e gli agenti di Azure Pipelines includono strumenti preinstallati:

Ambiente .NET SDK SqlPackage
Windows Preinstalled Preinstalled
Linux Preinstalled Non preinstallato
macOS Preinstalled Non preinstallato

In ambienti Linux e macOS installare SqlPackage come parte del flusso di lavoro. Per altre informazioni sull'installazione e il controllo delle versioni di SqlPackage nelle pipeline, vedere SqlPackage nelle pipeline di sviluppo.

Ambienti self-hosted

Eseguire la distribuzione da uno strumento di esecuzione self-hosted o da un agente quando è necessario un maggiore controllo sull'ambiente, ad esempio:

  • Requisiti di isolamento della rete (accesso ai database non esposti alla rete Internet pubblica)
  • Strumenti personalizzati o versioni specifiche di SqlPackage
  • Criteri di conformità o di sicurezza

È possibile distribuire strumenti di esecuzione self-hosted come processi di App Contenitore di Azure per l'esecuzione serverless basata su eventi. Usare questo approccio per definire l'ambiente in un Dockerfile e installare SqlPackage e altri strumenti in base alle esigenze.

GitHub Actions

L'azione Distribuzione SQL di Azure (azure/sql-action) offre un'esperienza integrata per la distribuzione di progetti e .dacpac file SQL in Azure SQL e SQL Server da qualsiasi strumento di esecuzione di GitHub Actions.

Funzionalità principali:

  • Distribuisce .dacpacgli script , .sqlprojo .sql .
  • Supporta l'autenticazione SQL, l'autenticazione di Microsoft Entra ID e l'autenticazione dell'entità servizio.
  • Aggiunge e rimuove automaticamente le regole del firewall temporanee per il database SQL di Azure in combinazione con azure/login.
  • Funziona sia nei runner Windows che in Linux.

Esempio: Distribuire un progetto SQL con GitHub Actions

# .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'

Per le distribuzioni di database SQL di Azure che richiedono una regola del firewall temporanea, aggiungere il azure/login passaggio prima sql-actiondi :

    - 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'

È anche possibile usare SqlPackage direttamente in qualsiasi strumento di esecuzione. Per altre informazioni, vedere SqlPackage nelle pipeline di sviluppo.

Azure Pipelines

Azure DevOps fornisce l'attività SqlAzureDacpacDeployment per la distribuzione di .dacpac file e script SQL nel database SQL di Azure.

Funzionalità principali:

  • Distribuisce i .dacpac file o esegue script SQL.
  • Supporta l'autenticazione SQL, l'autenticazione di Microsoft Entra ID e l'autenticazione dell'entità servizio.
  • Gestisce automaticamente le regole del firewall per il database SQL di Azure.
  • Richiede un agente Windows (usare SqlPackage direttamente sugli agenti Linux).

Esempio: Distribuire un .dacpac con Azure DevOps

# 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'

Per gli agenti Linux o un maggiore controllo sul processo di distribuzione, usare direttamente 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'

Altre piattaforme CI/CD

Per piattaforme come GitLab CI/CD, Jenkins, CircleCI o altri, usare SqlPackage direttamente per compilare e distribuire progetti SQL.

Compilare il progetto

dotnet build ./Database.sqlproj -c Release

Distribuire il .dacpac

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