Você usa o controle de código para os itens da sua base de dados? [fechado]

Acho que a minha loja tem um buraco porque não temos um processo sólido para alterar o esquema da nossa base de dados. Fazemos muitos backups por isso estamos mais ou menos cobertos, mas é má prática confiar na sua última linha de defesa desta forma.

Surpreendentemente, este parece ser um fio comum. Muitas lojas que eu falei para ignorar este problema porque suas bases de dados não mudam frequentemente, e eles basicamente apenas tentam ser meticulosos.

No entanto, sei como isso a história continua. É só uma questão de tempo até as coisas se alinharem e algo desaparecer.

Há boas práticas para isso? Quais são algumas estratégias que têm funcionado para você?

Author: Brian MacKay, 2008-09-22

30 answers

Deve lerObter a sua base de dados sob controlo de versões . Confira a série de posts de K. Scott Allen.

No que diz respeito ao controlo de versões, a base de dados é frequentemente um cidadão de segunda ou até de terceira classe. Pelo que eu vi, equipes que nunca pensariam em escrever código sem controle de versão em um milhão de anos-- e com razão-- podem de alguma forma ser completamente alheias à necessidade de controle de versão em torno das bases de dados críticas em que suas aplicações dependem. Não sei. como você pode se chamar de engenheiro de software e manter uma cara reta quando seu banco de dados não está exatamente sob o mesmo nível rigoroso de controle de fonte como o resto do seu código. Não deixes que isto te aconteça. Controle a sua base de dados.
 372
Author: Gulzar Nazim, 2014-05-19 14:58:07
As próprias bases de dados? Não

Os scripts que os criam, incluindo inserções de dados estáticos, procedimentos armazenados e afins; claro. Eles são Arquivos de texto, eles estão incluídos no projeto e são verificados dentro e fora como tudo o resto.

É claro que, num mundo ideal, a sua ferramenta de gestão de bases de dados faria isto, mas só tem de ser disciplinada sobre isso.
 133
Author: blowdart, 2008-09-22 15:09:22
Adoro absolutamente as migrações de corais. Ele abstrai o DML para ruby script que pode então ser facilmente versado em seu repositório de código. No entanto, com um pouco de trabalho, você poderia fazer a mesma coisa. Quaisquer alterações das DDL (alterar a tabela, etc.) pode ser armazenado em arquivos de texto. Manter um sistema de numeração (ou um carimbo de data) para os nomes dos ficheiros, e aplicá-los em sequência.

Os carris também têm uma tabela de 'versão' no DB que acompanha a última migração aplicada. Você pode fazer o mesmo facilmente.

 34
Author: Matt Rogish, 2009-12-17 15:40:43

Verifique O LiquiBase para gerir as alterações da base de dados usando o controlo de origem.

 32
Author: killdash10, 2008-09-22 18:12:38

Você nunca deve simplesmente entrar e começar a introduzir comandos "alterar tabela" para mudar uma base de dados de produção. O projeto que eu estou no banco de dados em cada local do cliente, e assim, todas as alterações para o banco de dados é feita em dois lugares, um arquivo de despejo que é usado para criar um novo banco de dados em um novo site do cliente, e um arquivo de atualização que é executado em cada atualização que verifica o banco de dados atual número de versão contra o maior número no arquivo, e atualiza seu banco de dados no local. Assim, por exemplo, as últimas actualizações:

if [ $VERSION \< '8.0.108' ] ; then
  psql -U cosuser $dbName << EOF8.0.108
    BEGIN TRANSACTION;
    --
    -- Remove foreign key that shouldn't have been there.
    -- PCR:35665
    --
    ALTER TABLE     migratorjobitems
    DROP CONSTRAINT migratorjobitems_destcmaid_fkey;
    -- 
    -- Increment the version
    UPDATE          sys_info
    SET             value = '8.0.108'
    WHERE           key = 'DB VERSION';
    END TRANSACTION;
EOF8.0.108
fi

if [ $VERSION \< '8.0.109' ] ; then
  psql -U cosuser $dbName << EOF8.0.109
    BEGIN TRANSACTION;
    --
    -- I missed a couple of cases when I changed the legacy playlist
    -- from reporting showplaylistidnum to playlistidnum
    --
    ALTER TABLE     featureidrequestkdcs
    DROP CONSTRAINT featureidrequestkdcs_cosfeatureid_fkey;
    ALTER TABLE     featureidrequestkdcs
    ADD CONSTRAINT  featureidrequestkdcs_cosfeatureid_fkey
    FOREIGN KEY     (cosfeatureid)
    REFERENCES      playlist(playlistidnum)
    ON DELETE       CASCADE;
    --
    ALTER TABLE     ticket_system_ids
    DROP CONSTRAINT ticket_system_ids_showplaylistidnum_fkey;
    ALTER TABLE     ticket_system_ids
    RENAME          showplaylistidnum
    TO              playlistidnum;
    ALTER TABLE     ticket_system_ids
    ADD CONSTRAINT  ticket_system_ids_playlistidnum_fkey
    FOREIGN KEY     (playlistidnum)
    REFERENCES      playlist(playlistidnum)
    ON DELETE       CASCADE;
    -- 
    -- Increment the version
    UPDATE          sys_info
    SET             value = '8.0.109'
    WHERE           key = 'DB VERSION';
    END TRANSACTION;
EOF8.0.109
fi
Tenho a certeza que há uma maneira melhor de fazer isto, mas até agora funcionou comigo.
 29
Author: Paul Tomblin, 2008-09-22 15:15:37
Sim. Código é código. Minha regra geral é que eu preciso ser capaz de construir e implantar a aplicação a partir do zero, sem olhar para uma máquina de desenvolvimento ou produção.
 15
Author: Stu Thompson, 2008-09-22 15:12:50
A melhor prática que vi foi criar um script de compilação para raspar e reconstruir a sua base de dados num servidor de teste. A cada iteração foi dada uma pasta para alterações de banco de dados, todas as alterações foram programadas com "Drop... Criar" 'S. Desta forma, você pode voltar para uma versão anterior a qualquer momento, apontando a compilação para a pasta para a qual você deseja a versão. Acho que isto foi feito com o NaNt/CruiseControl.
 14
Author: Sara Chipps, 2008-09-22 15:11:58
Sim, acho que é importante rever a sua base de dados. Não os dados, mas o esquema com certeza. Em Ruby On Rails, isto é tratado pelo framework com "migrações". Sempre que alterar o db, você faz um script que aplica as alterações e o verifica no controle de origem.

A minha loja gostou tanto dessa ideia que adicionámos a funcionalidade à nossa compilação baseada em Java usando scripts shell e Ant. Integrámos o processo na nossa rotina de implantação. Seria ser bastante fácil de escrever scripts para fazer a mesma coisa em outros frameworks que não suportam DB versioning fora-da-caixa.

 11
Author: Pete, 2017-05-23 12:10:47

Os novos projectos de bases de dados no Visual Studio fornecem o controlo de origem e mudam de scripts.

Eles têm uma ferramenta legal que compara bases de dados e pode gerar um script que converte o esquema de um para o outro, ou atualiza os dados em um para combinar com o outro.

O esquema do db está "desfeito" para criar muitos, muitos pequenos .ficheiros sql, um comando por DDL que descreve o DB.

+tom


Informação adicional 2008-11-30

Tenho-o usado como um desenvolvedor do ano passado e realmente gosto. Torna fácil comparar o meu trabalho dev com a produção e gerar um script para usar para o lançamento. Não sei se faltam características que o DBAs precisa para projetos de "tipo de empresa".

Porque o esquema está" desfeito" em ficheiros sql, o controlo de origem funciona bem.

Um deles é que precisas de ter uma mentalidade diferente quando usas um projecto db. A ferramenta tem um "projeto db" EM VS, que é apenas o sql, mais um gerado automaticamente a base de dados local que tem o esquema e alguns outros dados de administração -- mas nenhum dos dados da sua aplicação, mais o seu db local que você usa para o trabalho de dev de dados de app. Você raramente está ciente do db gerado automaticamente, mas você tem que saber dele lá para que você possa deixá-lo em paz :). Este db especial é claramente reconhecível porque tem um Guid em seu nome,

O projecto VS DB faz um bom trabalho ao integrar as alterações db que outros membros da equipa fizeram no seu local de trabalho. Project / associated db. mas você precisa dar o passo extra para comparar o esquema do projeto com o seu esquema dev db local e aplicar o mods. Faz sentido, mas parece estranho no início.

Os projectos DB são uma ferramenta muito poderosa. Eles não só geram scripts, mas podem aplicá-los imediatamente. Certifique-se de não destruir o seu db de produção com ele. ;)

Gosto muito dos projectos VS DB e espero usar esta ferramenta para todos os meus projectos db a avançar.

+tom

 8
Author: Tom A, 2008-11-30 19:56:38
Exigir que as equipas de desenvolvimento usem um sistema de gestão de controlo de fonte de base de dados SQL não é a bala mágica que irá impedir que os problemas aconteçam. Por si só, o controle de fonte de banco de dados introduz sobrecarga adicional como os desenvolvedores são obrigados a salvar as alterações que fizeram a um objeto em um script SQL separado, abrir o cliente do sistema de controle de fonte, verificar no arquivo de script SQL usando o cliente e, em seguida, aplicar as alterações ao banco de dados ao vivo. Posso sugerir ... usando o SSMS add-in chamado ApexSQL Source Control . Ele permite aos desenvolvedores mapear facilmente objetos de banco de dados com o sistema de controle de fonte através do assistente diretamente do SSMS. O add-in inclui suporte para TFS, Git, Subversion e outros sistemas SC. Ele também inclui suporte para controlar a fonte de dados estáticos.

Depois de obter e instalar o controlo de código ApexSQL, basta carregar com o botão direito na base de dados que deseja controlar a versão e navegar para o sub-menu de controlo de código ApexSQL em SSMS. Clique no banco de Dados Link para a opção de controle de origem, selecione o sistema de controle de origem e o modelo de desenvolvimento. Depois disso, você precisará fornecer a informação de log-in e o texto do repositório para o sistema de controle de origem que você escolheu.

Pode ler este artigo para mais informações: http://solutioncenter.apexsql.com/sql-source-control-reduce-database-development-time/

 8
Author: AliceF, 2015-09-07 10:43:12

Faço-o gravando scripts create/update e um script que gera sampledata.

 6
Author: Paco, 2008-09-22 15:09:55
Sim, fazemos isso mantendo o nosso SQL como parte da nossa construção -- continuamos a cair.SQL, cria.SQL, utilizadores.SQL, valores.SQL e controle de versão estes, para que possamos voltar a qualquer versão marcada. Também temos tarefas ant que podem recriar o db sempre que necessário. Além disso, o SQL é então marcado juntamente com o seu código fonte que o acompanha.
 6
Author: DustinB, 2008-09-22 15:10:35
Nós controlamos todos os objetos criados pelo dabase. E apenas para manter os desenvolvedores honestos (porque você pode criar objetos sem que eles estejam no controle de origem), nossos dbas periodicamente procuram por qualquer coisa que não esteja no controle de origem e se eles encontram alguma coisa, eles o largam sem perguntar se está ok.
 6
Author: HLGEM, 2008-09-22 15:25:38
O esquema mais bem sucedido que já usei num projecto combinou cópias de segurança e ficheiros SQL diferenciais. Basicamente, nós pegaríamos um backup de nosso db após cada lançamento e fazer um dump SQL para que pudéssemos criar um esquema em branco do zero, se precisássemos também. Em seguida, sempre que você precisava fazer uma mudança para o DB você iria adicionar um scrip alter para o diretório sql sob controle de versão. Nós sempre prefixaríamos um número de sequência ou data para o nome do arquivo para que a primeira alteração seria algo como uma coluna.sql, e o próximo script seria 02_ added_customers_ Index. A nossa máquina de informadores verificava isto e executava-os sequencialmente numa nova cópia do db que tinha sido restaurado do backup.

Também tínhamos alguns scripts que o devs poderia usar para reiniciar o seu db local para a versão actual com um único comando.

 5
Author: Mike Deck, 2008-09-22 15:13:23
Tenho tudo o que é necessário para recriar o meu DB a partir de metal nu, menos os dados em si. Tenho certeza de que existem muitas maneiras de fazê-lo, mas todos os meus scripts e tais são armazenados no subversion e podemos reconstruir a estrutura do DB e tal, retirando tudo isso do subversion e executando um instalador.
 4
Author: itsmatt, 2008-09-22 15:12:45

Eu normalmente construo um script SQL para cada alteração que faço, e outro para reverter essas alterações, e manter esses scripts sob controle de versão.

Então temos um meio de criar um novo banco de dados atualizado a pedido, e pode facilmente mover-se entre revisões. Cada vez que fazemos um lançamento, juntamos os scripts (requer um pouco de trabalho manual, mas raramente é realmente difícil) então também temos um conjunto de scripts que podem converter entre versões.

Sim, antes de dizeres it, this is very similar to the stuff Rails and others do, but it seems to work pretty well, so I have no problems admitting that I shamelessly lifted the idea:)
 4
Author: Dan, 2008-09-22 15:15:38

Eu uso o SQL cria scripts exportados a partir do MySQL Workbech, então usando a funcionalidade "Exportar SQL ALTER" deles eu acabo com uma série de scripts criar(numerados, é claro) e os scripts alter que podem aplicar as mudanças entre eles.

3.- Exportar o programa SQL alterar Normalmente você teria que escrever as declarações da tabela ALTER à mão agora, refletindo suas alterações que você fez ao modelo. Mas podes ser inteligente e deixar o Workbench fazer o trabalho duro por ti. Basta seleccionar o ficheiro - > Exportar - > Engenheiro avançado SQL alterar o programa ... do menu principal.

Isto pedir-lhe-á para indicar o ficheiro SQL criar com o qual o modelo actual deve ser comparado.

Seleccione o script SQL CREATE do Passo 1. A ferramenta irá então gerar o script de tabela ALTER para você e você pode executar este script contra o seu banco de dados para trazê-lo até a data.

Você pode fazer isto usando o navegador de consultas MySQL ou o cliente mysql.Voilà! O seu modelo e base de dados foram sincronizado!

Fonte: MySQL Workbench Community Edition: Guide to Schema Synchronization

Todos estes scripts, claro, estão dentro sob controle de versão.

 4
Author: levhita, 2008-09-22 17:30:01
Sim, sempre. Você deve ser capaz de recriar sua estrutura de banco de dados de produção com um conjunto útil de dados de amostra sempre que necessário. Se não o fizeres, com o tempo, pequenas mudanças para manter as coisas a funcionar são esquecidas, então um dia serás mordido, à grande. É seguro que você pode não pensar que você precisa, mas o dia em que você faz isso vale o preço 10 vezes mais!
 4
Author: AndrewB, 2008-09-22 20:29:56
Tem havido muita discussão sobre o modelo de banco de dados em si, mas também mantemos os dados necessários .Ficheiros SQL.

Por exemplo, para ser útil, a sua aplicação pode precisar disto na instalação:

INSERT INTO Currency (CurrencyCode, CurrencyName) 
VALUES ('AUD', 'Australian Dollars');

INSERT INTO Currency (CurrencyCode, CurrencyName) 
VALUES ('USD', 'US Dollars');

Teríamos um ficheiro chamado currency.sql sob subversion. Como um passo manual no processo de construção, comparamos a moeda anterior.sql para o mais recente e escrever um script de atualização.

 4
Author: WW., 2008-11-03 11:49:11

Nós controlamos a versão e a fonte de tudo o que rodeia as nossas bases de dados:

  • DDL (criar e alterar)
  • DML (dados de referência, códigos, etc.)
  • alterações do modelo de dados (utilizando ERwin ou ER/Studio)
  • alterações da configuração da Base de dados (permissões, objectos de segurança, alterações gerais da configuração)
Fazemos tudo isto com trabalhos automatizados usando o Gestor de mudanças e alguns scripts personalizados. Temos o Gerenciador de mudanças monitorando essas alterações e notificando quando elas são terminar.
 4
Author: Karen Lopez, 2009-05-09 20:25:48

Eu acredito que cada DB deve estar sob controle de fonte, e os desenvolvedores devem ter uma maneira fácil de criar seu banco de dados local a partir do zero. Inspirado pelo Visual Studio para profissionais de banco de dados, eu criei uma ferramenta de código aberto que scripts bases de dados MS SQL, e fornece e uma maneira fácil de implementá-los para o seu motor DB local. Tentar http://dbsourcetools.codeplex.com / . Divertir, - Nata.

 4
Author: Nathan Rozentals, 2009-07-07 13:30:44
Se a sua base de dados for o servidor SQL, podemos ter a solução que procura. O Controle de código SQL 1.0 foi agora lançado.

Http://www.red-gate.com/products/SQL_Source_Control/index.htm

Isto integra - se no SSMS e fornece a cola entre os objectos da base de dados e os VCS. O 'scripting out' acontece de forma transparente (ele usa o motor de comparação SQL sob o capô), o que deve torná-lo tão simples de usar que os desenvolvedores não será desencorajado de adotar o processo.

Uma solução alternativa Visual Studio é ReadyRoll , que é implementada como um subtipo do projecto de base de dados SSDT. Isto tem uma abordagem baseada em migrações, que é mais adequada aos requisitos de automação das equipes DevOps.

 4
Author: David Atkinson, 2016-05-17 13:42:44

USO SchemaBank para controlo de versões todas as alterações do esquema da minha base de dados:

    A partir do primeiro dia, importei o meu esquema de db para ele.
  • comecei a mudar o meu esquema usando um navegador web (porque são baseados em SaaS / cloud)
  • Quando eu quero atualizar o meu servidor db, eu gerar o script de mudança (SQL) a partir dele e aplicar para o db. No Schemabank, eles me mandatam para enviar meu trabalho como uma versão antes que eu possa gerar um script de atualização. Eu gosto deste tipo de pratique para que eu possa sempre rastrear quando preciso.
A regra da nossa equipa é nunca tocar directamente no servidor db sem armazenar primeiro o trabalho de projecto. Mas acontece que alguém pode ser tentado a quebrar a regra, por conveniência. Importávamos o lixo do esquema outra vez no schemabank e deixávamo-lo fazer a diferença e bater em alguém se fosse encontrada uma discrepância. Apesar de podermos gerar os programas alternativos a partir dele para fazer o nosso design db e schema em sincronia, simplesmente odiamos isso. [1] da maneira, eles também nos deixam criar ramos dentro da árvore de controle de versão para que eu possa manter um para encenação e um para produção. E um para codificar a caixa de areia.

Uma ferramenta de desenho de esquemas baseada na web com controlo de versões e gestão de mudanças.

 4
Author: Leigh Pyle, 2017-09-14 03:48:55

Eu controlo o esquema da base de dados programando todos os objectos (definições de tabelas, índices, procedimentos armazenados, etc.). Mas, quanto aos dados em si, basta confiar em backups regulares. Isto garante que todas as mudanças estruturais são capturadas com o histórico de revisão adequado, mas não sobrecarrega o banco de dados cada vez que os dados mudam.

 3
Author: Ben Hoffstein, 2008-09-22 15:11:44
No nosso negócio usamos scripts de alteração de bases de dados. Quando um script é executado, o seu nome é armazenado na base de dados e não será executado novamente, a menos que essa linha seja removida. Scripts são nomeados com base na data, hora e ramo de código, então a execução controlada é possível.

Lotes e lotes de testes é feito antes que os scripts são executados no ambiente ao vivo, então "oopsies" só acontece, em geral, em bases de dados de desenvolvimento.

 3
Author: Wes P, 2008-09-22 15:12:55
Estamos a mover todas as bases de dados para o controlo de origem. Estamos usando o sqlcompare para scriptar o banco de dados (um recurso de edição profissional, infelizmente) e colocar esse resultado no SVN. O sucesso da sua implementação dependerá muito da cultura e das práticas da sua organização. As pessoas aqui acreditam na criação de um banco de dados por aplicação. Há um conjunto comum de bancos de dados que são usados pela maioria das aplicações, bem como causando um monte de interdatabase dependências (algumas delas são circulares). Colocar os esquemas de banco de dados no controle de fonte tem sido notoriamente difícil por causa das dependências interdatabase que nossos sistemas têm. Boa sorte para ti, quanto mais depressa o experimentares, mais depressa resolves os teus problemas.
 3
Author: Min, 2008-09-22 15:23:15

Usei a ferramenta dbdeploy da ThoughtWorks at http://dbdeploy.com / . incentiva a utilização de programas de migração. A cada lançamento, consolidamos os scripts de mudança em um único arquivo para facilitar a compreensão e permitir que o DBAs "abençoe" as mudanças.

 3
Author: David Medinets, 2008-09-22 15:29:35

Este sempre foi um grande aborrecimento para mim também - parece que é muito fácil fazer uma mudança rápida em seu banco de dados de desenvolvimento, salvá-lo (esquecendo de salvar um script de mudança), e então você está preso. Você poderia desfazer o que você acabou de fazer e refazê-lo para criar o script de mudança, ou escrevê-lo do zero, se você quiser, claro, também, embora isso é muito tempo gasto escrevendo scripts.

Uma ferramenta que eu usei no passado que ajudou com isso alguns é SQL Delta. Ele irá mostrar-lhe as diferenças entre duas bases de dados (SQL server/Oracle I believe) e gerar todos os scripts de mudança necessários para migrar A->B. outra coisa boa que ele faz é mostrar todas as diferenças entre o conteúdo do banco de dados entre o DB de produção (ou teste) e o seu DB de desenvolvimento. Uma vez que cada vez mais aplicativos armazenam configuração e estado que é crucial para a sua execução em tabelas de banco de dados, pode ser uma dor real ter scripts de mudança que remover, adicionar e alterar as linhas apropriadas. Delta SQL mostra as linhas na base de dados tal como iriam procurar numa ferramenta de diferenças - alterada, adicionada, apagada.

Uma excelente ferramenta. Aqui está o link: http://www.sqldelta.com/
 3
Author: Sam Schutte, 2008-09-22 18:13:58

O RedGate é óptimo, geramos novos instantâneos quando são feitas alterações de bases de dados (um pequeno ficheiro binário) e mantemos esse ficheiro nos projectos como um recurso. Sempre que precisamos atualizar o banco de dados, usamos o kit de ferramentas do RedGate para atualizar o banco de dados, bem como ser capaz de criar novos bancos de dados a partir dos vazios.

RedGate também faz instantâneos de dados, embora eu não tenha trabalhado pessoalmente com eles, eles são tão robustos.
 3
Author: Tom Anderson, 2008-09-22 23:06:19
Para tua informação, isto também foi mencionado há alguns dias pela Dana ... procedimentos armazenados/esquema DB no controlo da fonte
 3
Author: Robert Paulson, 2017-05-23 10:31:37