Seções iMasters
Banco de Dados + Desenvolvimento

Database Source Control e Deploy

Todos os bons devs sabem que o código fonte deve estar no controle de versão. Há muitas razões para isso, mas uma das mais importantes é a capacidade de reconstruir e implantar seu aplicativo inteiro sempre que você quiser.

Artefatos de banco de dados (tables, views, triggers, stored procedures etc.) são parte integrante do aplicativo e, portanto, devem ser tratados como qualquer outro código. Você deve verificá-los no controle de versão. Você deve ser capaz de construir e implantá-los automaticamente, junto com o resto do aplicativo.

Existem provavelmente muitas estratégias para fazer isso, mas eu gostaria de me concentrar em duas: migração incremental e sincronização de schema.

Migração incremental

Com esta abordagem, cada vez que fizer uma alteração em seu esquema, você cria dois scripts: um para aplicá-lo e um para revertê-lo. Os scripts são numerados ou datados na ordem em que devem ser aplicados. Assim, a implementação de uma nova versão do banco de dados é simplesmente uma questão de aplicar esses scripts na ordem certa. Esta técnica é bastante popular e amplamente utilizada (Migrações Ruby são provavelmente o uso mais notável dela).

Esta abordagem é legal porque é simples. Scripts delta são fáceis de criar e aplicar, os esquemas de banco de dados são fáceis de interpretar, as mudanças são fáceis de reverter. A principal complicação é que você precisa monitorar qual a versão do banco de dados você está implementando. Caso contrário, você corre o perigo de não aplicar todas as mudanças necessárias.

Sincronização de schema

Com esta abordagem, todo o seu esquema de banco de dados é primeiro verificado no controle de versão, com cada artefato sendo representado por um script. É importante notar que esses scripts geralmente contêm apenas operações CREATE (e não ALTER). Para fazer uma mudança no esquema, basta modificar o script correspondente.

A parte realmente interessante é como as implementações acontecem. Para implementar, você direciona para um banco de dados físico. Seu esquema é comparado ao esquema representado por scripts no controle de versão. Um script delta é então gerado e executado contra o alvo. Projetos de banco de dados do Visual Studio usam essa abordagem para gerenciar mudanças de esquema e implementações, como faz o controle de versão SQL do Red Gate.

A coisa legal sobre a sincronização de schema é que ela funciona com qualquer versão do banco de dados. Se você apontar para um banco de dados local vazio, ele irá reconstruí-lo a partir do zero. Se você apontar para a produção, ele vai aplicar apenas as alterações que são realmente necessárias.

Escolhendo a melhor solução

Acho que a opção de sincronização de schema funciona um pouco melhor com DBAs, porque o processo de implementação produz um script delta único, que eles podem examinar e se sentirem confortáveis com as mudanças antes de aplicarem as mudanças à produção.

Por outro lado, desenvolvedores preferem a migração incremental porque é mais utilizada, é mais transparente (ou seja, não há mágica para descobrir o que o delta é), e é mais amigável aos devs. Há até frameworks que permitem que você codifique suas migrações como objetos (um bom exemplo em .NET é o Fluent Migrator, que permite que você altere mudanças no BD usando uma DSL em C#).

Independentemente da opção que você escolha, você deve se certificar de que ela funciona para todos os que farão mudanças em esquema no BD: devs e DBAs (e qualquer outra pessoa que precise tocar o banco de dados). Existe um perigo na hora de escolher uma solução que seja realmente amigável aos devs, mas estranha aos DBAs.

Lembre-se: se a solução que você escolheu não for aceita por toda a equipe, isso irá derrubar a finalidade de ter seu esquema db sob controle de versão em primeiro lugar.

?

Texto original disponível em http://tatiyants.com/database-source-control-and-deployment/

Mensagem do anunciante:

Torne-se um Parceiro de Software Intel®. Filie-se ao Intel® Developer Zone. Intel®Developer Zone

Qual a sua opinião?