COMO ATUALIZAR BANCO DO SQL SERVER

JCM0867 25/07/2015 12:16:13
#449220
Olá pessoal

Seguinte, possuo diversos clientes tudo na mesma área, logo todos possuem estrutura de bancos de dados idênticos.
Se durante o desenvolvimento preciso altera o Banco (Criar tabela ou mudar campos) como ficam os clientes? preciso entrar no banco de cada cliente e alterar o banco? Existe alguma solução, programa ou função no SQL que faça as alterações nos banco de forma automática e confiável?
Por exemplo tenho o banco no meu pc com as alterações, ter alguma maneira de levar essas alterações (tipo um log) que em um clique ou dois cliques o usuário atualiza o banco de dados.
Uso VB.NET

Eu fiz um programa, mas não estou 100% confiante que ele funcionará corretamente
Eu pego meu banco alterado vazio, descarrego no cliente com um nome temporário, ele pega os dados do cliente e coloca os dados nas respectivas tabelas do banco temporário e depois ele apaga a tabela original e renomeia a banco temporário para o nome correto, aparentemente funciona, mas é complicado depurar 80 tabelas para ver se ele fez tudo certo. Assim ele terá tabelas novas e os campos alterados, logico que tabelas novas e campos novos estarão vazios. E se der um erro no meio da estrada, ele pode botar a integridade do banco em risco.
Criar tabelas vazias até é fácil, basta montar um create.
Tem outra alternativa ou até mesmo uma solução de terceiros?
KERPLUNK 25/07/2015 16:28:06
#449224
O ideal para sua situação é um simples script SQL contendo as alterações que você precisa que sejam feitas. Elas não vão mexer nos dados dos clientes. Scripts como:

ALTER TABLE Clientes ADD TipoCliente VARCHAR(50) // para adicionar um campo
ALTER TABLE Clientes DROP COLUMN NomeColuna // para remover um campo
ALTER TABLE Clientes ALTER COLUMN TipoCliente Int // para alterar o tipo de dados de um campo


Com o script contendo todas as alterações necessárias em mãos, você vai ao cliente e o executa, assim, você adequa a estrutura dele.
NICKOSOFT 25/07/2015 16:51:01
#449225
Em servidor mysql ou sqlserver eu sempre na tela de inicializacao dos orogramas erifico acesso ao servidor, caso flhe carrego a tela de configuracies, qnd o acesso foi bem sucedido verifico se a tabela existe c um select, caso nao, dou o create table no programa mesmo e asim verifico todas....
Vc pode partir um select com os campos novos, caso falhe use o alter table
JCM0867 25/07/2015 19:23:05
#449228
Citação:

:
O ideal para sua situação é um simples script SQL contendo as alterações que você precisa que sejam feitas. Elas não vão mexer nos dados dos clientes. Scripts como:


ALTER TABLE Clientes ADD TipoCliente VARCHAR(50) // para adicionar um campo
ALTER TABLE Clientes DROP COLUMN NomeColuna // para remover um campo
ALTER TABLE Clientes ALTER COLUMN TipoCliente Int // para alterar o tipo de dados de um campo


Com o script contendo todas as alterações necessárias em mãos, você vai ao cliente e o executa, assim, você adequa a estrutura dele.



Esses comandos eu conheço, gostaria que fosse mais automático, o banco novo reconheceria que tal tabela e tal campo não existem ou foi alterado no banco antigo e acrescentaria ou alteraria automaticamente. Sem precisar lembrar tudo que eu alterei.

Dessa maneira que tu descreveu precisaria anotar todas as alterações que fiz e fazer uma script para ser executada e tomara que não esqueça de nada.
KERPLUNK 25/07/2015 19:55:51
#449230
Bem, existe o TableDiff que faz comparações entre tabelas de dois bancos diferentes e as equipara. Mas se você quer algo mais automático, aí a coisa complica consideravelmente. é possível, mas de maneira procedural ficaria meio difícil. Usando OOP, você poderia fazer uma classe contendo a estrutura da tabela e comparar com uma mesma classe que leu a estrutura de outra instância, então depois disso determinar as diferenças e gerar os comandos SQL necessários para equiparação.
JCM0867 26/07/2015 11:17:56
#449236
Citação:

:
Bem, existe o TableDiff que faz comparações entre tabelas de dois bancos diferentes e as equipara. Mas se você quer algo mais automático, aí a coisa complica consideravelmente. é possível, mas de maneira procedural ficaria meio difícil. Usando OOP, você poderia fazer uma classe contendo a estrutura da tabela e comparar com uma mesma classe que leu a estrutura de outra instância, então depois disso determinar as diferenças e gerar os comandos SQL necessários para equiparação.



Eu até fiz algo desse tipo, levei dias fazendo, só que ainda não tive coragem de usar no cliente.
Eu terei que rodar aqui e abrir tabela por tabela para ver se não apagou nada.

LAMPIAO 26/07/2015 15:00:18
#449240
Rapaz, eu uso o SQL Compare da RedGate, uso desde 2011, é pago, mas é muito bom. Esse negócio de reinventar a roda é complicado e arriscado quando envolve banco de dados.

Mas mesmo usando o SQL Compare, você deve ter noção de que dependendo do tipo de modificação que será feita, você poderá sim perder dados. Por exemplo: alterar o tipo de campo de uma tabela pode, dependendo da mudança haver perda de dados. Então você precisa sim fazer uma analise, um backup antes de fazer a mudança.

Outra coisa, esqueça a possibilidade do seu cliente fazer isso, a possibilidade de dar merda é de 99%, então não corra esse risco.

A outra coisa que uso é o migrations do entity framework, mas ai o seu sistema teria que esta usando essa tecnologia, enfim são essas as dicas que deixo aqui, no link você pode baixar a versão de testes por 14 dias. Infelizmente a licença dele hoje na minha opnião esta cara pra nós tupiniquins $495 obamas e não inclui o imposto.

Abraços.
LAMPIAO 26/07/2015 15:06:45
#449241
Complementando minha resposta, você cita no post que queria algo automático, quem pode fazer isso é o entity framework.

Você define esse comportamento na configuração do seu contexto habilitando a migração automática, mas eu não conheço ninguém que faça isso, pois a possibilidade de haver perda de dados é grande, e ninguém quer correr esse risco, eu uso esse recurso no meu ambiente de desenvolvimento, mas desabilito quando vai para o cliente.

é essa a outra dica.

Abraços
Tópico encerrado , respostas não são mais permitidas