Tive dificuldade para encontrar bons exemplos de como gerenciar esquemas e dados de banco de dados entre servidores de desenvolvimento, teste e produção.
Aqui está a nossa configuração. Cada desenvolvedor tem uma máquina virtual executando nosso aplicativo e o banco de dados MySQL. É sua caixa de areia pessoal fazer o que quiserem. Atualmente, os desenvolvedores fazem uma alteração no esquema SQL e fazem um despejo do banco de dados em um arquivo de texto que eles confirmam no SVN.
Queremos implantar um servidor de desenvolvimento de integração contínua que sempre esteja executando o código confirmado mais recente. Se fizermos isso agora, ele recarregará o banco de dados do SVN para cada build.
Temos um servidor de teste (virtual) que executa "liberar candidatos". A implantação no servidor de teste atualmente é um processo muito manual e geralmente envolve o carregamento do SQL mais recente do SVN e o aprimoramento. Além disso, os dados no servidor de teste são inconsistentes. Você acaba com quaisquer dados de teste que o último desenvolvedor confirmar no seu servidor sandbox.
Onde tudo quebra é a implantação na produção. Como não podemos sobrescrever os dados ativos com dados de teste, isso envolve recriar manualmente todas as alterações de esquema. Se houver um grande número de alterações de esquema ou scripts de conversão para manipular os dados, isso pode ficar muito complicado.
Se o problema fosse apenas o esquema, seria um problema mais fácil, mas também existem dados "básicos" no banco de dados que são atualizados durante o desenvolvimento, como metadados nas tabelas de segurança e permissões.
Essa é a maior barreira que vejo ao avançar para a integração contínua e a criação de uma etapa. Como você resolve isso?
Uma pergunta de acompanhamento: como você controla as versões do banco de dados para saber quais scripts executar para atualizar uma determinada instância de banco de dados? Uma tabela de versões como Lance menciona abaixo do procedimento padrão?
Obrigado pela referência a Tarantino. Não estou em um ambiente .NET, mas achei a página wiki do DataBaseChangeMangement muito útil. Especialmente esta apresentação em Powerpoint (.ppt)
Vou escrever um script Python que verifica os nomes dos *.sql
scripts em um determinado diretório em uma tabela no banco de dados e executa os que não estão lá em ordem, com base em um número inteiro que forma a primeira parte do nome do arquivo. Se for uma solução bastante simples, como suspeito, será postada aqui.
Eu tenho um script de trabalho para isso. Ele lida com a inicialização do banco de dados, se ele não existir, e com a execução de scripts de atualização, conforme necessário. Também existem opções para limpar um banco de dados existente e importar dados de teste de um arquivo. São cerca de 200 linhas, por isso não vou publicá-lo (embora eu possa colocá-lo no pastebin, se houver interesse).