Re: [firebase-br] Campo Auto-Incremento Sem Perda da Seqüência..

Giovani Benedetti Penha giovani em cooperval.com
Ter Jul 12 17:03:17 -03 2005


Allan,
A meu ver, uma forma seria retornar um gen_id(gerador,0) do seu banco e 
atribuir +1 manualmente pelo código.
O gen_id(gerador,0) não altera o valor do generator. Atribuindo +1 por 
código você "simularia" o próximo valor do gerador, mas sem alterar seu 
valor atual. Então, apenas se a inserção fosse confirmada, você chamaria 
o gen_id(gerador,1), para atualizar o valor do gerador. 
Porém, aí temos um problema grave: se existirem duas transações ativas 
ao mesmo tempo em dois clientes diferentes, as duas iriam obter o mesmo 
gen_id e tentariam gravar com a mesma chave, ocasionando problema de 
violação da chave primária. Mas se o sistema for executado por um único 
cliente, daí acredito que resolva seu problema.
E fiquei com uma dúvida agora também: ao iniciar uma transação, 
atualizar um generator e dar um rollback na transação, o valor do 
generator voltaria ao que era antes da transação? Em teoria sim né? Se 
isso funcionasse, você poderia comitar a transação sempre que a inserção 
ocorresse ou rollback caso fosse cancelada. Alguém sabe o que 
aconteceria nesse caso?

Espero ter ajudado mais do que confundido!

[]´s
Giovani Benedetti Penha


Allan Elias Ramos escreveu:

>Olá pessoal, tudo bem? Espero que sim..
>
>Olha, não sei se tem algum jeito de fazer isso, mas minha dúvida é a seguinte:
>
>Pra criar um campo auto-incremento no Firebird, é necessário um Generator e uma Trigger. Isso eu sei fazer, e consigo também gerar o número no campo antes de salvar o registro (eu preciso disso pq preciso desse código). Mas assim, se eu criar um novo registro e não salvar ele, por acaso eu cancelar a inserção de dados, esse código gerado se perde, por exemplo.
>
>Código 1 - Salvo
>Código 2 - Salvo
>Código 3 - Cancelado
>Código 4 - Salvo
>
>A idéia seria não perder o código 3, ficando assim:
>
>Código 1 - Salvo
>Código 2 - Salvo
>Código 3 - Cancelado
>Código 3 - Salvo
>
>Eu sei q, por exemplo, no Access ele funciona assim.. quando um código gerado automaticamente não é usado, ele nao é descartado, é guardado pra uso posterior.. tem como fazer isso no Firebird?
>
>Só pra deixar claro, quero esse funcionamento só no caso de um cancelamento na inserção do registro. Sei que, quando um registro é deletado, o código não pode mais ser aproveitado.
>
>Agradeço desde já a ajuda.. abraços..
>
>
>Allan Elias Ramos
>______________________________________________
>FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.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
>
>
>  
>



Mais detalhes sobre a lista de discussão lista