Trabalhando em um projeto com várias ramificações, onde cada ramificação é eventualmente mesclada de volta à ramificação principal e, em essência, é isolada para desenvolver um novo recurso.
O banco de dados, que é o MS SQL Server, possui um esquema compartilhado, porém cada ramificação faz alterações no esquema à medida que avança.
Minha pergunta principal é quais são as boas maneiras de lidar com o compartilhamento do esquema da ramificação principal até a derivada, de modo que as alterações feitas na ramificação principal sejam facilmente mescladas na ramificação derivada, sem pisar em novas alterações na derivada. ramo?
Respostas:
Utilizei com sucesso a seguinte metodologia, elaborada no Controle de Versão e no seu Banco de Dados :
Costumo ouvir a opinião de 'como isso é diferente de apenas manter os scripts de definição de objeto sob controle de origem?'. A diferença é enorme, porque quando você implanta uma nova versão do seu aplicativo, não cria simplesmente um novo banco de dados. Na maioria das vezes, seu aplicativo precisará atualizar o banco de dados existente, incluindo os dados existentes . Essa é uma diferença crucial. Suas etapas de atualização precisam garantir a integridade e a consistência dos dados existentes durante a atualização. Algumas operações são triviais no código (adicione uma coluna não anulável com valor padrão ao script de definição de objeto de tabela, concluído), mas na verdade são extremamente dolorosas na implantação real (a tabela possui 1,5 bilhão de linhas, a coluna de adição acabaria espaço de log, se feito da maneira "simplória").
Como isso funciona com a ramificação:
Observe que não há nenhuma ferramenta envolvida, nenhum script de diff de esquema mágico, nenhum assistente e nenhum script de botão direito do mouse gerado. Este é um processo 100% orientado ao desenvolvedor, baseado na fonte (scripts). Muitos acham todo esse processo elaborado, mas funciona. De fato, como usuário do SQL Server, você já aproveitou os resultados desse processo no uso diário do SQL Server: o próprio SQL Server usa um processo de atualização de banco de dados muito semelhante e, como você provavelmente espera, o processo de desenvolvimento de produtos faz uso extensivo de ramificação e o problema que você mencionou é um problema muito real que precisa ser resolvido.
BTW, como a ramificação / integração realmente ocorre difere entre os produtos de controle de origem, estou usando os termos familiares do modo de operação de integração forçada .
fonte
Embora minha resposta possa não ser tão longa quanto a de Remus, achei essa uma solução muito boa. Ainda não o configurei em produção, então YMMV *.
Liquibase
Essencialmente, é um arquivo XML em que você faz alterações de esquema no banco de dados como novos elementos dentro do arquivo XML. Por exemplo:
Ele possui uma sintaxe completa, para que você possa fazer o que quiser com o banco de dados.
Você também especifica em sua instalação do Liquibase qual banco de dados você deseja versionar. Em seguida, você "executa" o .xml com o executável Java incluído (arquivo jar). Isso essencialmente recria as alterações especificadas no XML no seu banco de dados.
O verdadeiro kicker é que você armazena esse arquivo XML na mesma pasta com versão do seu código. Então, no meu exemplo, esse foi o Git. Eu tinha esse arquivo XML na minha pasta do projeto (mesmo nível que /.git) e, sempre que eu alternava as ramificações, o arquivo XML mudava para essa versão da ramificação e eu executava o arquivo .jar e meu banco de dados agora refletia essa ramificação.
* Nota: Não concluí a implementação porque tive problemas para conectar o Java ao SQL Server. Precisa de alguns drivers jdbc e tal e eu não estava de bom humor. Portanto, sua milhagem pode variar.
fonte
Aqui no Red Gate, lançaremos em breve uma solução de versão de banco de dados que aproveita o SQL Compare e o SQL Source Control. Isso usa uma abordagem de atualização de scripts de migração e carimba o banco de dados com uma propriedade estendida de versão que corresponde a uma revisão de controle de origem.
Esperamos lançar em meados de dezembro. Há um candidato a lançamento disponível agora. Para mais informações visite:
http://www.red-gate.com/products/sql-development/sql-source-control/entrypage/migration
Esperamos desenvolver essa solução nos próximos meses. Portanto, informe-nos o que você pensa.
fonte
Se você e o seu esquema forem alterados gerando scripts e mantendo esses scripts sob controle de origem, poderá tratar as alterações como faria com qualquer outra mesclagem de código. Você pode optar por mesclar automaticamente ou realizar mais intervenções manuais.
fonte
Estou em uma situação semelhante em que trabalho em um site ativo e em várias ramificações de desenvolvimento nas quais preciso alterar o esquema do banco de dados.
Eu o resolvi escrevendo um post-checkout e um gancho pós-mesclagem que podem ser usados com o git. Eu armazeno todas as minhas migrações na forma de arquivos SQL em um diretório separado e as confirmo junto com o código PHP alterado. Cada vez que executo um
ou um
O git chamará automaticamente as migrações para cima e para baixo apropriadas. Veja minha implementação no Github .
fonte