Ir para conteúdo
Fórum Script Brasil
  • 0

Cópia de informações entre bancos


NIK

Pergunta

Pessoal... bom dia

Eu gostaria da ajuda de vocês para uma situação.

Tenho uma base oficial chamada BASE1 e fiz um backup/restore em uma nova base que chamo de BASETESTE. Até ai tudo bem.

O que eu preciso fazer agora.

A base oficial é onde todos trabalham, dessa forma, existe inclusão de novos clientes, fornecedores, produtos etc constantemente. A base teste que criei somente é para meu uso, porém, eu preciso que toda inserção de novos registros, inclusão de clientes, etc da base oficial sejam copiados nessa minha base teste. Não necessariamente automatico, pode ser uma vez ao dia, com um detalhe irei fazer algumas alterações de dados na base teste que não poderão ser sobrepostos quando vier informações da base oficial, por isso, que preciso que somente sejam copiados novas informações inseridas na base oficial.

Caso alguém possa me ajudar...

Obrigado a todos e tenham um excelente dia.

NIK

:D

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

Boa tarde NIK,

A base possui muitas tabelas? Ou seriam todas as tabelas a serem atualizadas?

Pode-se implementar uma rotina em que os dados são lidos na Base Oficial e gravados apenas os dados inseridos recentemente na Base de Testes (através de Linked Server).

Algo do tipo:

insert into TabelaTeste

select * from TabelaProducao where not exists (select * from TabelaTeste)

Neste caso, se tiverem poucas tabelas, dá pra fazer na mão mesmo.

Se tiver grande quantidade de tabelas, pode-se criar uma tabela na Base contendo os nomes de todas as tabelas que deseja atualizar (sysobjects). você fará um loop lendo nas linhas os nomes das tabelas e criando uma instrução de sql dinamicamente. Aí basta executá-la. Ex.:

Declare @SQL varchar(50)

Declare @NomeTabela varchar(50)

Set @SQL = 'select * from ' + @NomeTabela + ' where not exists (select * from '+ @NomeTabela + ')'

exec (@SQL)

Se quiser inserir mais tabelas, basta colocar o nome dela na tabela de controle de Nomes de Tabelas. Não se altera o script.

Link para o comentário
Compartilhar em outros sites

  • 0

Fulvio... beleza??

Obrigado pela resposta...

Bem... a idéia é essa, porém, não sei se você conhece mas trabalho com RM Sistemas e os módulos deles e a estrutura de dados tem tabela pra caramba, mas nesse caso não seriam todas elas atualizadas não, somente algumas.

No processo que você mostrou abaixo, não teria empacto nas chaves primárias e estrangeiras? Caso eu fizesse uma importação de dados de uma tabela que na verdade recebe dados de outra que não foi atualizada?

Valeu

NIK

Link para o comentário
Compartilhar em outros sites

  • 0

Boa tarde NIK,

Conheço a empresa. Tenho vários colegas que trabalham ai. Agora é TOTVS.... :.)

Se forem muitas tabelas, seria interessante você utilizar a segunda opção (sql dinâmico). Para não dar problema de chaves, você terá q criar uma coluna apenas para identificar a cronologia das tabelas. Primeiro você terá que inserir nas mães, para depois inserir nas filhas. Caso fique muito lento, desative todas as contrants. Quando acabar, ative novamente (na mesma transação).

Tenho dois processos grandes que rodam na empresa desta forma. Uma é expurgo de dados. Aí eu excluo da filhas e depois da mãe (o inverso do seu caso).

O problema será se, por exemplo:

Na Base Oficial houver uma inserção do Produto X, com PK=20

Na Base Teste houver uma inserção do Produto Y, com PK=20

Na atualização dos dados entre Produção e Teste, como cruzará PK´s, terá a PK=20 em Produção identificando o produto X e no Teste o produto Y. Pra resolver este problema, você terá que bater descrição. Será praticamente inviável... fora que as filhas ficarão com referências erradas.

Link para o comentário
Compartilhar em outros sites

  • 0

Fulvio... beleza

nesse caso

----

extraido do seu texto

Declare @SQL varchar(50)

Declare @NomeTabela varchar(50)

Set @SQL = 'select * from ' + @NomeTabela + ' where not exists (select * from '+ @NomeTabela + ')'

exec (@SQL)

----

Tenho que referenciar campo a campo, ele pega a linha inteira, e outra coisa, ele somente incluirá linhas que ainda não existem ou verificará a tabela inteira e fará um update em toda a tabela??

:wacko:

Valeu

NIK

Link para o comentário
Compartilhar em outros sites

  • 0

Boa tarde NIK,

Estava pensando aqui.... se você insere dados diferentes nos Bancos de Teste e Produção, esta atualização não será possível... Como vai saber o dado X é realmente o dado Y, batendo as chaves que foram inseridas em bancos distintos?

Nesta idéia de sql dinâmico, como utiliza o *, você não precisa referenciar todos os campos. Apenas a tabela nas duas bases devem estar iguais (quantidade de campos, ordem e tipo). Será inserida apenas as informações novas, que existam na base de Produção e não exista na base de Teste. No caso não será updade, mas insert.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...