Compartilhar via


Automação de projetos SQL

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do Azure

Este artigo fornece uma visão geral das opções de automação para projetos SQL em diferentes plataformas de entrega de software. Use a automação para integrar projetos de banco de dados SQL em pipelines de CI/CD e implantar alterações de banco de dados de forma consistente e repetida.

O que automatizar

A automação de projetos SQL normalmente envolve duas tarefas principais em um pipeline de CI/CD:

  • Crie o projeto SQL: valide o projeto e produza o artefato de implantação (.dacpac) em execução dotnet build no projeto do banco de dados SQL a ser compilado. Opcionalmente, execute regras de análise de código para verificar a qualidade do código durante o build do projeto.

  • Implante o .dacpac: publicar em .dacpac um banco de dados de destino usando o SqlPackage ou uma tarefa específica da plataforma. A implantação pode ter como destino o Banco de Dados SQL do Azure, a Instância Gerenciada de SQL do Azure, o SQL Server ou o Banco de Dados SQL no Fabric.

Diagrama mostrando o fluxo do build do projeto SQL para o artefato dacpac e a implantação para um banco de dados.

Quando você integra essas etapas ao pipeline de CI/CD, as alterações de banco de dados são validadas em cada confirmação e implantadas consistentemente entre ambientes.

Conceitos comuns

Fluxo de artefatos: um pipeline típico separa os estágios de build e implantação. O estágio de build compila o projeto SQL e produz um .dacpac arquivo, que é publicado como um artefato de pipeline. Em um trabalho de implantação subsequente (potencialmente após a aprovação manual), o artefato é baixado e implantado no banco de dados de destino. Essa separação permite que você crie uma vez e implante o mesmo artefato em vários ambientes, garantindo consistência.

Publicar ou script: antes de implantar em ambientes confidenciais, você pode examinar o plano de implantação. O SqlPackage dá suporte a uma Script ação que gera o script T-SQL que seria executado durante a implantação, sem aplicar alterações. O script T-SQL fornecido permite que os administradores ou revisores de banco de dados examinem as alterações exatas necessárias para aplicar a .dacpac aprovação anterior. Da mesma forma, a ação DeployReport produz um relatório XML das alterações planejadas.

Aprovações e portões de ambiente: as implantações de produção normalmente exigem fluxos de trabalho de aprovação para evitar alterações não intencionais. O GitHub Actions e o Azure DevOps dão suporte a aprovações baseadas em ambiente. No GitHub, você pode configurar ambientes com revisores e temporizadores de espera necessários. No Azure DevOps, os ambientes dão suporte a portões de aprovação, restrições de horário comercial e outros controles de implantação. Esses controles ajudam a garantir que as alterações de banco de dados sejam revisadas e aprovadas antes de atingir a produção.

Pré-requisitos

O SqlPackage é multiplataforma e é executado no Windows, linux e macOS. Instale-o como uma ferramenta global do .NET para garantir um comportamento consistente entre ambientes.

  • SDK do .NET instalado no agente de build.

  • SqlPackage instalado no agente de build. Você pode instalar o SqlPackage como uma ferramenta global do .NET:

    dotnet tool install --global microsoft.sqlpackage
    

Plataformas de entrega de software

Escolha um ambiente que corresponda aos requisitos de ferramentas, conformidade e conectividade da sua equipe.

Ambientes virtuais gerenciados

Os ambientes virtuais gerenciados pela Microsoft para os executores hospedados do GitHub Actions e os agentes do Azure Pipelines incluem ferramentas pré-instaladas:

Ambiente SDK do .NET SqlPackage
Windows Pré-instalado Pré-instalado
Linux Pré-instalado Não pré-instalado
macOS Pré-instalado Não pré-instalado

Em ambientes Linux e macOS, instale o SqlPackage como parte do fluxo de trabalho. Para obter mais informações sobre a instalação e o controle de versão do SqlPackage em pipelines, consulte SqlPackage em pipelines de desenvolvimento.

Ambientes auto-hospedados

Implante de um executor ou agente auto-hospedado quando precisar de mais controle sobre o ambiente, como:

  • Requisitos de isolamento de rede (acessando bancos de dados não expostos à Internet pública)
  • Ferramentas personalizadas ou versões específicas do SqlPackage
  • Políticas de conformidade ou segurança

Você pode implantar executores auto-hospedados como trabalhos dos Aplicativos de Contêiner do Azure para execução sem servidor controlada por eventos. Use essa abordagem para definir o ambiente em um Dockerfile e instalar o SqlPackage e outras ferramentas, conforme necessário.

GitHub Actions

A ação de Implantação de SQL do Azure (azure/sql-action) fornece uma experiência integrada para implantar projetos e .dacpac arquivos SQL no SQL do Azure e no SQL Server de qualquer executor do GitHub Actions.

Principais capacidades:

  • .dacpacImplanta, .sqlprojou .sql scripts.
  • Dá suporte à autenticação SQL, à autenticação da ID do Microsoft Entra e à autenticação da entidade de serviço.
  • Adiciona e remove automaticamente regras de firewall temporárias para o Banco de Dados SQL do Azure quando combinadas com azure/login.
  • Funciona em ambos os executores do Windows e do Linux.

Exemplo: implantar um projeto SQL com o 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'

Para implantações do Banco de Dados SQL do Azure que exigem uma regra de firewall temporária, adicione a azure/login etapa antes sql-action:

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

Você também pode usar o SqlPackage diretamente em qualquer executor. Para obter mais informações, consulte SqlPackage em pipelines de desenvolvimento.

Azure Pipelines

O Azure DevOps fornece a tarefa SqlAzureDacpacDeployment para implantar .dacpac arquivos e scripts SQL no Banco de Dados SQL do Azure.

Principais capacidades:

  • .dacpac Implanta arquivos ou executa scripts SQL.
  • Dá suporte à autenticação SQL, à autenticação da ID do Microsoft Entra e à autenticação da entidade de serviço.
  • Gerencia automaticamente as regras de firewall do Banco de Dados SQL do Azure.
  • Requer um agente do Windows (use SqlPackage diretamente em agentes do Linux).

Exemplo: implantar um .dacpac com o 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'

Para agentes do Linux ou mais controle sobre o processo de implantação, use o SqlPackage diretamente:

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'

Outras plataformas de CI/CD

Para plataformas como a CI/CD do GitLab, Jenkins, CircleCI ou outras, use o SqlPackage diretamente para criar e implantar projetos SQL.

Compilar o projeto

dotnet build ./Database.sqlproj -c Release

Implantar o .dacpac

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