[firebase-br] Chave Primária Duplicada

Carlos H. Cantu listas em warmboot.com.br
Segunda Setembro 12 09:05:20 -03 2022


Imagino a seguinte situação:

1) Houve uma corrupção na base de dados, mais especificamente no índice da PK da 
tabela de vendas, que é usado pelo Firebird para saber se já existe um registro e 
impedir duplicidade. Com a corrupção, o FB não encontrou a venda no índice e 
deixou gravar uma segunda venda com os mesmos IDs, pois para ele, ainda não 
existia.

2) Em algum momento, você fez um backup/restore. Durante o restore, os índices 
são recriados e com isso a "duplicidade" apareceu, fazendo com que o a PK 
ficasse desativada no banco restaurado. Se vc não se atentou nisso (o gbak 
reporta o problema), pode ter usado o banco com a PK desativada, possibilitando 
o surgimento de novas duplicidades, já que a PK não estava ativa para assegurar 
que isso não acontecesse.

PS: Corrupção não é normal. Sugiro que verifique o ambiente do servidor, 
especialmente HDDs e memória RAM, e lembre-se de deixar o forced writes ligado.

[]s
Carlos H. Cantu
eBook Guia de Migração para o FB 4 - www.firebase.com.br/guiafb4.php
www.FireBase.com.br - www.firebirdnews.org - blog.firebase.com.br

VDvl> Boa tarde,

VDvl> Temos uma tabela (VENDAS). Ocorre também em outras tabelas, mas, aqui vamos nos ater apenas à VENDAS.
VDvl> Entre outros campos, a VENdAS tem o NUMERO e FILIAL. Estes 2 compõem o índice primário.

VDvl> Se tentarmos gravar a venda 100, com FILIAL 1, uma segunda vez,
VDvl> obviamente que o Firebird vai "berrar", porque se está tentando duplicar o índice primário.
VDvl> É claro que antes do Firebird gerar erro, é aplicação que deve controlar
VDvl> isso e não permitir que chegue a esse ponto. Mas...

VDvl> O problema que ocorre, muito eventualmente, mas ocorreu já mais de uma
VDvl> vez com usuários nossos é: o banco de dados está lá, tudo certo, com a
VDvl> venda 100 registrada apenas 1 vez, o índice primário ativo, tudo certo.
VDvl> Aí faz-se um backup e o restore com gbak.exe. Nesse restore vem duas
VDvl> vendas 100, com filial 1 registradas, o que obviamente vai dar conflito no
VDvl> banco pelo fato do índice primário estar duplicado.
VDvl> Ao mesmo tempo, o índice primário é desativado automaticamente. Acredito
VDvl> que o Firebird faça isso (desativar o índice), justamente para poder
VDvl> restaurar esse segundo registro da venda 100.
VDvl> Obs.: não é a mesma venda 100, pois outros campos não têm o mesmo valor. São duas vendas 100 diferentes.

VDvl> A única coisa que posso imaginar é que por algum erro, em algum momento,
VDvl> o sistema tentou registrar duas vezes com o mesmo número (100 e FILIAL 1)
VDvl> e o Firebird não permitiu. Entretanto esses dados não gravados  (da
VDvl> segunda venda) ficaram em "um limbo" e, ao fazer o restore, eles foram ressuscitados.
VDvl> Tentamos de todas formas reproduzir o problema em labortório, mas não
VDvl> ocorre. Sempre que se tenta gravar uma segunda vez registro com os mesmos
VDvl> dados nos campos índice, o Firebird impede e descarta tudo (corretamente).
VDvl> Quado o usuário nos envia o banco, o problema já está instalado.

VDvl> Alguém poderia me dar uma luz sobre isso. Pode ser de fato isso que
VDvl> esteja ocorrendo? Como é que o Firebird permitiu um segundo registro com a
VDvl> mesma chave primária? E como não permitir que o Firebird gere essa situação?

VDvl> Usamos Firebird 2.5

VDvl> Qualquer sugestão é bem vinda!

VDvl> Obrigado!


VDvl> ------------------------------------------------------------------------
VDvl> /Cordialmente
VDvl> Valdir Dill
VDvl> /
VDvl> ______________________________________________
VDvl> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
VDvl> Para saber como gerenciar/excluir seu cadastro na lista, use:
VDvl> http://www.firebase.com.br/fb/artigo.php?id=1107
VDvl> Para consultar mensagens antigas: http://www.firebase.com.br/pesquisa_lista.html




Mais detalhes sobre a lista de discussão lista