Controle de versão com SQL Server

14

Estou iniciando um novo projeto e usando o SVN (com o Tortoise) como meu sistema de controle de versão. Eu queria saber se era possível também manter um banco de dados SQL Server usando o mesmo sistema.

Eu gostaria de versão minhas tabelas / funções / visualizações / procs / triggers / etc. mas não os meus dados, pois todos serão dados de teste de qualquer maneira. Não tenho muita certeza de como configurar isso. Encontrei algumas opções, mas gostaria de saber se havia alguma que estivesse faltando, e se há algum guia ou algo lá fora para me ajudar a continuar com ela.

Eu já vi e ouvi falar do Red Gate, mas estou procurando algo gratuito (ou pelo menos, muito baixo custo). Eu sei que sempre poderia escrever algo sozinho, mas não estou tentando gastar tempo nisso.

Uma coisa que encontrei foi um pacote de código aberto chamado ScriptDB4Svn . Alguém usou isso antes? Isso é bom? Ele pode fazer as coisas que eu preciso e é bem simples de configurar?

yannis
fonte
1
Has anyone used this before? Is it good? Can it do the things I need it to do and is it pretty simple to get setup?Por que você tem medo de tentar por si mesmo? Basta pegar e brincar.
precisa saber é
@YannisRizos - Eu definitivamente terei, se não receber muita resposta disso, basicamente só queria tentar economizar algum tempo e ver se alguém já havia trabalhado com isso antes ou se alguém tinha alguma coisa tentada e testada logo de cara. que atendam às minhas necessidades, para economizar tempo de experimentação.
Só notei como você é nova por aqui. Programadores SE não é um bom lugar para fazer perguntas, apenas para economizar algum tempo, nós realmente esperamos que você faça coisas assim por si mesmo, ou seja, faça sua própria pesquisa antes de perguntar . Ou, alternativamente, pergunte no chat (mas não espere respostas sólidas). Dito isso, realmente não importa, porque essa última frase não é sua pergunta principal, que é realmente muito boa (e devidamente etiquetada, isso é raro para novos usuários, parabéns!).
precisa saber é
@YannisRizos - thanks. Entrarei no bate-papo para ver se posso obter algum feedback sobre o ScriptDB4Svn e verifique aqui se há atualizações para a questão principal. Editar: Parece que não posso conversar até ter 20 representantes. Oh, bem, paciência, eu acho.

Respostas:

2

Tecnicamente, você nem precisa de uma ferramenta, pode script os objetos diretamente e verificá-los no controle de origem. É um pouco mais de trabalho sem a ferramenta, mas é definitivamente viável.

BTW: Eu usei a ferramenta RedGate e é muito lisa e vale o dinheiro.

JohnFx
fonte
Então, basicamente, eu faria o meu trabalho no Management Studio e depois exportaria os scripts para o diretório SVN, e basicamente o faria toda vez que eu trabalhar nele (substituindo os antigos a cada exportação)? Eu acho que isso funcionaria. Isso manteria a funcionalidade SVN de poder reverter e outras coisas, mas sim, seria uma espécie de aborrecimento. Talvez eu verifique o preço do RedGate e veja se vale a pena para mim.
@ Scott - A maneira manual pode funcionar, basta pensar no seu desenvolvimento SQL de maneira diferente. As versões com script dos objetos são as "oficiais" e a versão em SQL é apenas uma versão compilada. Assim como seu código fonte.
JohnFx
Decidi fazer as coisas manualmente e, possivelmente, implementar um script usando a ajuda nos links fornecidos por Mike Nakis, mas por enquanto vou usar a GUI interna do Management Studio para exportar os scripts de criação de banco de dados quando terminar. funcionando, verifique-os e deixe que o SVN os mantenha com a versão dessa maneira. Desde que eu decidi fazer as coisas manualmente, você obter a resposta por apontar Eu realmente não precisa de uma ferramenta para fazer essas coisas :)
1

Parece que você tem uma configuração principalmente da Microsoft. Você pode dar uma olhada em Projetos de banco de dados (anteriormente conhecido como DataDude). Eles basicamente transformam o T-SQL em uma linguagem de primeira classe no Visual Studio; você pode:

  • Compilar projetos - ele não cria apenas um script final, garante que os nomes de objetos etc. existam.
  • Execute a análise estática do código - por exemplo, garantindo que você sempre se refira aos objetos, incluindo o esquema (por exemplo, [dbo]na maioria dos casos) para obter um ótimo aumento de 30% no desempenho.
  • Crie scripts diff, comparando diferentes versões do projeto.
  • Atualize seu projeto a partir de um banco de dados ou script (engenharia reversa).
  • Intellisense.
  • Não há ferramentas de diagramação.

Eles unificam seu código e o código do banco de dados também sob controle de origem. Se você criar e criar scripts para seus objetos de banco de dados (em vez de usar o Davinci Tools no SSMS), também usará um IDE - o que é bom.

Jonathan Dickinson
fonte
0

Você pode usar o Rails. O Rails tem um conceito de migração de banco de dados que você pode aplicar ou reverter. Na minha experiência, esta é a melhor maneira de versão de um banco de dados. Você verifica esses arquivos de migração no SVN.

No meu projeto atual, não estamos desenvolvendo o aplicativo em Ruby, mas ainda estamos usando o Rails para gerenciar o banco de dados. Eu não faria isso de outra maneira.

Vinnie
fonte
Algum guia para explicar um pouco mais e definir algo assim?
Na verdade, não é uma boa idéia usar o Rails junto com as tecnologias .NET.
alternativo
Capítulo sobre migrações do Rails ( Guides.rubyonrails.org/migrations.html ). Isso deve ser suficiente para você começar e fornecer todo o histórico necessário para o porquê de ser uma boa idéia. @altern - como você está apenas usando o Rails para manipular e versão do banco de dados, isso deve ter algum impacto nas tecnologias .NET. Você poderá acessar e usar o banco de dados da mesma maneira como se não estivesse usando trilhos. Eu não me importaria de ver algumas referências às suas preocupações. O IronRuby não é uma implementação .Net do Ruby and Rails?
Vinnie
> O IronRuby não é uma implementação .Net do Ruby e Rails? IronRuby é uma implementação .NET do Ruby . Não tenho certeza se o Rails funciona corretamente no IronRuby. Meu argumento geral contra o uso do Rails para fins de controle de versão em db é que Ruby e tecnologias relacionadas (RoR, migratinos) têm uma curva de aprendizado bastante acentuada, especialmente para tarefas simples como o controle de versão em db. Não há problema em usá-lo para outros fins, não apenas para migrações. Caso contrário, apenas aumentará a complexidade do projeto sem muito efeito positivo.
alternativo
0

Isso foi discutido anteriormente no stackoverflow: /programming/2750278/sql-server-2008-create-database-script-schema-data-with-command-line

Além disso, este artigo externo fornece algumas informações adicionais http://www.sqlteam.com/article/scripting-database-objects-using-smo-updated junto com o código de exemplo na forma de um aplicativo do Windows.

Como o que você quer fazer é algo que eu mesmo fiz para o MS Access, vou lhe contar o que fiz caso isso lhe dê algumas idéias: escrevi um módulo chamado Ado2Xml que converte o esquema e os dados de qualquer ADO banco de dados acessível para xml e vice-versa. Porém, ele conhece apenas tabelas e visualizações; sem procedimentos armazenados, sem gatilhos, sem nada. De qualquer forma, no seu caso, este módulo é substituído pela ferramenta que você provavelmente encontrará o que deseja com o MS-SQL. Portanto, toda vez que meu aplicativo é iniciado, ele compara o registro de data e hora do banco de dados com o registro de data e hora do arquivo xml salvo; se o arquivo xml for mais recente, ele destrói o banco de dados e chama o Ado2Xml para recriá-lo a partir do arquivo xml. Quando meu aplicativo termina, ele faz o inverso: ele invoca o Ado2Xml para exportar o banco de dados para o arquivo xml. Na realidade, por algum motivo, os objetos ADO que extraem o esquema do banco de dados são muito lentos, fazendo com que o processo de exportação demore algum tempo. Portanto, para evitar ter que esperar cada vez que meu aplicativo seja finalizado e o visual studio alternar do layout de depuração para o layout de edição, logo antes de terminar, meu aplicativo inicia um aplicativo externo para exportar, para que ele possa finalizar imediatamente.

Mike Nakis
fonte
Os dois links que você forneceu são algo que eu provavelmente estou interessado em configurar, para que eu possa basicamente automatizar as etapas manuais que estou executando agora. Obrigado por aqueles!
0

Sim, usei uma ferramenta semelhante (desenvolvida internamente) em um projeto anterior. Ele script todas as tabelas, visualizações, sprocs, gatilhos, etc em arquivos .sql individuais. Em seguida, tínhamos um script executado todas as noites para "validar" que tudo em nosso banco de dados de "desenvolvimento" se refletia no controle de origem.

Portanto, o fluxo de trabalho normal é que você altera seu código, altera as tabelas e sprocs correspondentes no banco de dados de desenvolvimento, conforme necessário, e executa a ferramenta que possuímos, que atualiza todos os arquivos .sql com script. Você então verifica tudo de uma vez.

O problema era que, se você esquecesse de executar a ferramenta, o código "funcionaria" (e os testes de unidade passariam) porque o banco de dados estava "correto", mas os novos sprocs / tabelas não seriam o controle de origem.

Então, todas as noites, temos um script que faz o check-out do código-fonte e, em seguida, reúne a ferramenta para atualizar todos os scripts. Se houver alguma diferença, significa que alguém esqueceu de fazer o check-in de suas alterações e uma notificação por email foi gerada. Era basicamente apenas uma maneira de garantir que não esquecessemos de manter o controle da fonte atualizado.

Foi um pouco chato porque dificultava o trabalho de alterações que duravam vários dias, mas era melhor do que não ter nada ...

Dean Harding
fonte
Você pode elaborar Then, we had a script that ran every night to "validate" that everything in our "development" database was reflected in source control.? Obrigado pela sua resposta.
@ Scott: Eu editei a resposta para incluir um pouco mais de detalhes.
Dean Harding