como atualizar DB

Firebird

16/08/2008

Salve amigos
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

F4rr3ll

Curtidas 0

Respostas

Carlosib

Carlosib

16/08/2008

Ai vai uma sugestão....

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
Sremulador

Sremulador

16/08/2008

amigo, para pequenos programas pode se fazer isso mesmo, porem para os grantes fica complicado.


GOSTEI 0
Carlosib

Carlosib

16/08/2008

O que você recomendaria para os grandes?


GOSTEI 0
Alderico.dias

Alderico.dias

16/08/2008

Faça o seguinte amigo: Crie um campo novo

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
Sremulador

Sremulador

16/08/2008

Faça o seguinte amigo: Crie um campo novo 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.


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
Alderico.dias

Alderico.dias

16/08/2008

Realmente o pessoal costuma criar um programa paralelo para fazer este tipo de processo. Eu mesmo tenho um sistema que possui o banco no firibird dai quando tenho alguma manutenção no banco, como por exemplo criar mais campos em uma tabela ou mais uma tabela no banco ou várias tabelas, dai ao executar o sistema coloco um parametro ´verificadb´, sendo assim ele chama outro aplicativo que neste aplicativo faço uma reestruturação em todas as tabelas e campos do banco, sendo assim vejo o que tem de novo para ser criado, levando em consideração que quando for alteração de campo, faço exatamente o que escrevi no item anterior.

Veja se ajuda em alguma coisa qualquer coisa vc avisa. boa sorte amigo.


GOSTEI 0
Sremulador

Sremulador

16/08/2008

Realmente o pessoal costuma criar um programa paralelo para fazer este tipo de processo. Eu mesmo tenho um sistema que possui o banco no firibird dai quando tenho alguma manutenção no banco, como por exemplo criar mais campos em uma tabela ou mais uma tabela no banco ou várias tabelas, dai ao executar o sistema coloco um parametro ´verificadb´, sendo assim ele chama outro aplicativo que neste aplicativo faço uma reestruturação em todas as tabelas e campos do banco, sendo assim vejo o que tem de novo para ser criado, levando em consideração que quando for alteração de campo, faço exatamente o que escrevi no item anterior. Veja se ajuda em alguma coisa qualquer coisa vc avisa. boa sorte amigo.


de que forma você faz esta restruturação de dados, pois você tem que ter um modelo original, para tal tarefa...


GOSTEI 0
Alderico.dias

Alderico.dias

16/08/2008

Desta forma utilizei da seguinte forma: tenho um arquivo xml que guardo toda a
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
Sremulador

Sremulador

16/08/2008

seria bom alguma função, tipo exportação do ibconsole, para comparação de dados...


GOSTEI 0
Alderico.dias

Alderico.dias

16/08/2008

É realmente se tivesse algo automático ficaria bem melhor mesmo..
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
Sremulador

Sremulador

16/08/2008

tem com componenete que promete fazer isso, da componente acer, mas nunca testei...


GOSTEI 0
POSTAR