Fórum como atualizar DB #60108
16/08/2008
0
Estou trabalhando recentemente numa empresa que tenho um programa de altomação que comecei mecher a poucos dias, Delphi7+firebird2.0, e tive que alterar uns campos no banco, e adicionar outros, e esta auterações sera feira para varios clientes que ja esta usando o sistema.
Agora é a questão
Como faço estes alterações no BD com esses campos novos, sem perder as informações ja cadastradas.
Ja pesquisei muito, ja postei em outros forum e a té mesmo aqui e nada, e impossivel fazer isso? Se alguem ja teve esta esperiencia e quiser compartilhar o conhecimento, fico muito agradecido.
Me ajudem porfavor
Abraço a Todos
F4rr3ll
Curtir tópico
+ 0Posts
18/08/2008
Carlosib
Crie um procedimento para atualizar a base de dados ao iniciar o seu programa.
Grave em algum local a versãodo ´banco de dados´.
No procedimento use os comando SQL para alterar as tabelas:
ALTER TABLE NOME_DA_TABELA ADD CAMPOS TIPO_DO_CAMPO....
Grosseiramente seria essa a minha idéia.
Gostei + 0
18/08/2008
Sremulador
Gostei + 0
18/08/2008
Carlosib
Gostei + 0
18/08/2008
Alderico.dias
Ex
ALTER TABLE NOMEDATABELA ADD CAMPONOVO TIPODOCAMPO
Ao ter concluido este processo vc fará o seguinte: Copiar tudo que já consta no campo velho para este campo novo da seguinte forma:
Ex:
UPDATE NOMEDATABELA SET CAMPONOVO = (SELECT CAMPOVELHO FROM NOMEDATABELA).
Ou seja vc cria um campo novo copia tudo que consta no campo velho para o campo novo e depois por fim vc deleta o campo velho.
Ex:
ALTER TABLE NOMEDATABELA DELETE CAMPO.
Talvez tenha ajudado em algo. boa sorte.
Gostei + 0
19/08/2008
Sremulador
bem, eu vejo muito o pessoal fazer um programinha aparte, assim que eu faço tb, pois tenho no db 200 tabelas, ae p eu testar uma a uma, ptz, o usuário iria esperar um bocado...
Gostei + 0
20/08/2008
Alderico.dias
Veja se ajuda em alguma coisa qualquer coisa vc avisa. boa sorte amigo.
Gostei + 0
20/08/2008
Sremulador
de que forma você faz esta restruturação de dados, pois você tem que ter um modelo original, para tal tarefa...
Gostei + 0
20/08/2008
Alderico.dias
estrutura das tabelas e campos com seus respectivos ids. Ex:
TABELA: CONTASPAGAR
ID NOME TIPO TAMANHO
1 - CAMPO01 INTEGER 0
2 - CAMPO02 INTEGER 0
3 - CAMPO03 VARCHAR 30
4 - CAMPO04 CHAR 1
5 - CAMPO05 TIMESTAMP 0
Sendo assim tenho um mapeamento de todoas as tabelas e seus campos. Quando vou criar um campo novo, simplesmente adiciono mais um registro no xml como pode ver acima. Quando vou alterar um campo simplesmente altero o registro em que desejo fazer a alteração,
vejamos um exemplo: Seguindo a estrutura acima vou mudar o tamanho do campo CAMPO03 de 30 PARA 40. Sendo assim basta alterar o registro (3) e mudar o campo TAMANHO para 40, em seguida salvo a alteração.
Agora vejamos como isto irá afetar o sistema: Quando seu sistema for iniciado vc deve colocar uma condicional para chekar se existe alguma alteração no XML pois ele é a estrutura do seu banco de dados. Se tiver alguma alteração o sistema de reestruturação de tabelas entrará em ação, verificando todos os registros do xml para ver se realmente
bate com o que existe no banco de dados. No caso sitado acima irá verificar uma divergencia na tabela CONASPAGAR. Assim o sistema irá conferir campo a campo para ver qual a alteração que existe. Ele irá encontrar uma mudança no ampo CAMPO03 pois o seu tamanho não irá bater.
É neste ponto que faço uma copia dos dados que contem no CAMPO03 para que eu não perca nada, criando um campo
qualquer para mover os dados para ele Ex: crio um campo chamado CAMPO03MODY em seguida movo todo o conteudo do
campo CAMPO03 para este campo, na sequencia deleto o CAMPO03 e crio ele novamente. Quando vc cria ele novamente ele será
criado com o novo tamanho em seguida vc move todos os registros do campo CAMPO03MODY para este novo campo.
Este procedimento é bem rápido, se tratando de de sql.
Veja se ajuda em alguma coisa. Qualquer coisa avisa.
Gostei + 0
20/08/2008
Sremulador
Gostei + 0
20/08/2008
Alderico.dias
Havia me esquecido tem um select que montei que retorna toda a estrutura da tabela campo, tamanho e muito mais. execute ai e veja se ajuda em alguma coisa, ele demora um pouco pois traz tudo mesmo, mas aguarde que o resultset tem muitas coisas que facilitará sua conferencia dos campos tamanhos etc.
SELECT DISTINCT
CAMPOS.RDB$FIELD_NAME AS COLUMN_NAME,
CASE
WHEN DADOSCAMPO.RDB$FIELD_PRECISION > 0 THEN ´NUMERIC´
WHEN TIPOS.RDB$TYPE_NAME = ´LONG´ THEN ´INTEGER´
WHEN TIPOS.RDB$TYPE_NAME = ´SHORT´ THEN ´SMALLINT´
WHEN TIPOS.RDB$TYPE_NAME = ´INT64´ THEN ´NUMERIC´
WHEN TIPOS.RDB$TYPE_NAME = ´VARYING´ THEN ´VARCHAR´
WHEN TIPOS.RDB$TYPE_NAME = ´TEXT´ THEN ´CHAR´
WHEN TIPOS.RDB$TYPE_NAME = ´BLOB´ THEN ´BLOB SUB_TYPE´
ELSE
TIPOS.RDB$TYPE_NAME
END AS FIELD_TYPE,
CASE
WHEN DADOSCAMPO.RDB$FIELD_TYPE IN(16,8) THEN
DADOSCAMPO.RDB$FIELD_PRECISION
ELSE
DADOSCAMPO.RDB$FIELD_LENGTH
END AS DATA_LENGTH
-- UDF_ABS(DADOSCAMPO.RDB$FIELD_SCALE) AS DATA_SCALE,
-- CASE CAMPOS.RDB$NULL_FLAG WHEN 1 THEN ´N´ ELSE ´Y´ END AS NULLABLE
FROM
RDB$RELATIONS TABELAS,
RDB$RELATION_FIELDS CAMPOS,
RDB$FIELDS DADOSCAMPO,
RDB$TYPES TIPOS
Gostei + 0
21/08/2008
Sremulador
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)