Re: [firebase-br] Violação de chave primária

nosbori em yahoo.com.br nosbori em yahoo.com.br
Ter Fev 13 17:52:18 -03 2007


Olá José, tubo bem?

Até então eu não conhecia o Generator. Realmente deu certo.

O Generator é do Firebird ou é uma função que tenho em qualquer banco de 
dados?

Obrigado pela solução...

Robson

----- Original Message ----- 
From: "José Aparecido da Silva" <joseasilva em bol.com.br>
To: "'FireBase'" <lista em firebase.com.br>
Sent: Tuesday, February 13, 2007 4:17 PM
Subject: RES: [firebase-br] Violação de chave primária


Use generator que com certeza o seu problema terminará.

Crie ele no seu banco;
Create generator NomeDoSeuGenerator;

Atribua um valor a ele:
Set generator NomeDoSeuGenerator to 0;

Chame o valor com: gen_id(NomeDoSeuGenerator,ValorAAcrescentar);

Se por exemplo for um sql de atualização:

Insert into Tabela (id,descrição,outrainformacao) values
(gen_id(NomeDoSeuGenerator,1),'descricao','outra informacao');

O Generator irá assegurar que ninguém ira ter o mesmo valor.

Se você quiser atribuir o valor antes de inserir os dados, recupere o valor
com uma query assim: (supondo que você usa delphi)

Query.sql.add('select gen_id(NomeDoSeuGenerator,1) as NR from RDB$DATABASE
');
Query.open;

NR:= query.FieldByName('NR').asInteger;

E usa do jeito que voce quizer.

Outro modo de fazer é criando um Trigger de Before Insert onde você verifica
atualiza o valor da sua chave primaria:
ChavePrimaria = gen_id(NomedoSeuGenerator,1);

Espero que com essas informações você possa resolver o seu problema.

Abraços
Jose Aparecido da Silva



-----Mensagem original-----
De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] Em
nome de nosbori em yahoo.com.br
Enviada em: terça-feira, 13 de fevereiro de 2007 10:47
Para: FireBase
Assunto: [firebase-br] Violação de chave primária

Bom dia pessoal,

estou com um problema:

Tenho um mesmo sistema instalado em diversas máquinas. Esse sistema em
determinada hora do dia recebe um volume muito grande de informações.

Eu tenho uma tabela no meu banco de dados que armazena o Sequence de uma
derminada tabela, e o problema que estou tento é que quando várias máquinas
tentam salvar o registro na mesma tabela eles pegam o mesmo ID e ocorre erro
de violação de chave primária.

Exemplo:

Vamos imaginar que tenho as seguintes tabelas:

TAB_APONTAMENTO

TAB_SEQUENCE

onde essa TAB_SEQUENCE controla os ID's corrente de todas as tabelas do meu
banco de dados....

Quando eu vou inserir um registro na TAB_APONTAMENTO o sistema consulta o
ultimo ID na TAB_SEQUENCE e insere o registro.

Problemas: Quando mais de um usuário tenta realizar um apontameto ao mesmo
tempo... o sistema que estão instalado em máquinas distintas, pegam o mesmo
ID e ocorre o erro...

Detalhe: Cada vez que eu consulto o ultimo ID de uma tabela, já dou um
UPDATE com o valor que achei + 1....

Se alguém puder me ajudar.... eu agradeço..

Robson

______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para editar sua configuração na lista, use o endereço
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa

-- 
No virus found in this incoming message.
Checked by AVG Free Edition.
Version: 7.5.441 / Virus Database: 268.17.37/682 - Release Date: 12/2/2007
13:23


-- 
No virus found in this outgoing message.
Checked by AVG Free Edition.
Version: 7.5.441 / Virus Database: 268.17.37/682 - Release Date: 12/2/2007
13:23



______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para editar sua configuração na lista, use o endereço 
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa 


		
_______________________________________________________ 
Yahoo! Mail - Sempre a melhor opção para você! 
Experimente já e veja as novidades. 
http://br.yahoo.com/mailbeta/tudonovo/
 






Mais detalhes sobre a lista de discussão lista