Como eu faço para saber qual sera o proximo valor a ser gerado por um generator do FireBird ? tipo tenho um cadastro de funcionarios que o ultimo está com o CODIGO=1 o proximo será o 2, como fazer isso de dentro da minha aplicação JAVA ?
Existe um artigo no JavaPro “JDBC The Next Generation” que discute, entre vários aspectos, um método chamado getGeneratedKeys() que retorna um conjunto de resultados com todas as chaves geradas automaticamente. Este método deve ser chamado imediatamente após a chamada ao executeUpdate().
wow! e isso é garantido? quero dizer: é garantido que, em tráfego intenso, um outro usuário não vá acessar o BD e adicionar um novo registro no lapso de tempo entre o executeUpdate() e a próxima chamada? Isso é perigoso, não é?! :shock:
pois é, anjomal; o método getGeneratedKeys() vai retornar um recordset, contendo as chaves geradas automaticamente pela chamada ao método executeUpdate().
O artigo que eu te indiquei está explicando direitinho, inclusive com fragmentos de código nos pontos exatos das chamadas.
acho que tanto com o getGeneratorKeys você pega as suas chaves e se deu azar de alguem ter inserido mais um registro logo depois de você, pode pegar outras chaves também,
a unica solução que conheço para você ter certeza que tem o valor sa sua chave é incrementar o generator antes (e não por trigger como se costuma fazer, e inserir aquele valor como a sua chave
urubatan, eu acho que você está enganado. O trigger é um método seguro de incrementar o gerador e atribuí-lo ao identificador de uma tabela (normalmente a chave-primária) em uma operação atomizada.
Sobre incrementar o gerador “no braço”… não sei não! As chaves estrangeiras (foreign keys) de tabelas dependentes podem ficar danificadas se o projetista do BD não tiver definido um relacionamento forte entre as tabelas.
com certeza triggers são ótimos meios de incrementar a chave primaria
não sei se me expressei direito, o que quiz dizer é que com uma trigger gerando o valor por um generator no firebird se o seu BD for muito “movimentado” você não tem como ter certeza de qual valor da chave primaria do registro que você acabou de incluir
neste cado, acho que a unica solução é:
select gen_id(meu_generator,1) from rdb$database
pegar o valor retornado e inserir o registro,
este valor é impossivel de ser repetido pois os generators são entidades independentes de transação
então não teria problema nenhum com FKs
soi só isto que eu quiz dizer
mas com certeza, uma trigger é uma ótima maneira de fazer isto, até é por isto que no FB nos temos triggers before e after insert, delete e update