[firebase-br] Incrementar Generator na Trigger After Insert

-=SchiavoR=- schiavor em gmail.com
Ter Dez 19 19:36:36 -03 2006


Bastante interessante também sua sugestão Fernando.

No caso do meu exemplo o campo CODIGO é sim PK, como pode ser notado na 
trigger este campo sempre é inserido com o valor 0, por que eu criei a 
PK com valor Default = 0, por isso não existe o problema de violação, eu 
não deixo ele ser inserido com nulo e também não preciso passar o código 
no insert INSERT INTO CLIENTES(NOME) VALUES('TESTE1').
Neste contexto, será que existe a possibilidade de um conflito na inserção?
Vamos pensar em um exemplo de uso, como um cadastro de clientes, quantos 
clientes precisariam estar sendo cadastrados simultaneamente e a 
possibilidade de dois ou mais usuários enviarem o commit para o banco, e 
o banco recebesse essa gravação no mesmo momento, antes que a trigger 
after insert de um deles pudesse ser concluída fazendo o update do 
código, permitindo que ocorresse a duplicade de codigo = 0. Qual seria a 
probabilidade disso ocorrer? E mesmo que ocorresse esse erro, bastaria o 
usuário que recebeu a exceção enviasse novamente o commit, não seria 
este um cenário com uma grande margem de segurança?


[ ]'s
Rodrigo Schiavo


Fernando Reis Guimarães escreveu:
> tive uma ideia, cria uma pk com before insert i cria outra trigger afert
> insert que atulize outro campo como nosso amigo rodrigo citou, para isso
> crie um indice desc no campo, e mande pegar o ultimo número tipo : update
> tabela set campo = ( select max(campo) from tabela) + 1
>
>
> Em 19/12/06, Rodrigo A. de Freitas <rodrigo em solucoeseinformatica.com.br>
> escreveu:
>   
>> Hmm... Esse campo código não é chave primária, é ? Senão você terá um
>> problema de violação de chave primária no momento em que mais de um
>> usuário estiver usando o sistema simultaneamente e ambos gravarem o valor
>> "0" no banco de dados;
>>
>> Claro que, dependendo do número de usuários, a chance é pequena, mas ainda
>> sim ela existe.
>>
>> Se existe a necessidade de você manter um campo com codificação
>> sequencial, que não pule um número ou se repita, é aconselhável que você
>> crie outro campo para PK, com o valor dele sendo alimentando por um
>> generator em uma trigger no before insert, e você pode criar uma rotina
>> que verifique a disponibilidade códigos, que pode ser alimentada via SP ou
>> trigger.
>>
>> []'s
>>
>> Rodrigo A. de Freitas
>>
>>
>>     
>>> Obrigado aos que responderam,
>>>
>>> Qdo eu mandei a mensagem, esqueci de mencionar que eu já sei utilizar,
>>> inclusive já utilizo em alguns sistemas o incremento do gerador na
>>> trigger Before Insert, porém quando utilizado o incremento neste
>>> contexto se houver alguma exceção no momento da inclusão, o código que
>>> foi inserido será perdido devido ao rollback.
>>> Estou querendo discutir os problemas, vantagens e desvantagens de fazer
>>> este incremento no evento After Insert, portanto no exemplo que enviei
>>> todos os novos registros são inseridos com código 0, e após a efetiva
>>> gravação no banco o código é atualizado com o valor correto, e o gerador
>>> incrementado.
>>>
>>> [ ]'s
>>> Rodrigo Schiavo
>>>
>>> Rodrigo A. de Freitas escreveu:
>>>       
>>>> Rodrigo,
>>>>
>>>> Uma melhor implementação para isso seria no evento Before Insert:
>>>>
>>>> CREATE TRIGGER CLIENTES_BI FOR CLIENTES
>>>> ACTIVE BEFORE INSERT POSITION 0
>>>> AS
>>>> BEGIN
>>>>     IF NEW.CODIGO = 0 THEN
>>>>         NEW.CODIGO = GEN_ID(GEN_CLIENTES_ID,1);
>>>> END
>>>>
>>>> []'s
>>>>
>>>> Rodrigo A. de Freitas
>>>> Análise & Desenvolvimento
>>>>
>>>> Soluções & Informática
>>>> www.solucoeseinformatica.com.br
>>>>
>>>>
>>>>
>>>>         
>>>>> Galera, blz?
>>>>>
>>>>> Estou pensando em fazer essa Trigger no evento After Insert, o custo
>>>>> dela seria muito grande para o banco?
>>>>>
>>>>> CREATE TRIGGER CLIENTES_AI FOR CLIENTES
>>>>> ACTIVE AFTER INSERT POSITION 0
>>>>> AS
>>>>> BEGIN
>>>>>   UPDATE CLIENTES SET CODIGO = GEN_ID(GEN_CLIENTES_ID,1) WHERE CODIGO
>>>>>           
>> =
>>     
>>>>> 0;
>>>>> END
>>>>>
>>>>> Att.
>>>>> Rodrigo Schiavo
>>>>>
>>>>>
>>>>> ______________________________________________
>>>>> 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
>>>>>
>>>>>
>>>>>
>>>>>           
>>>>
>>>> ______________________________________________
>>>> 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
>>>>
>>>>
>>>>         
>>> ______________________________________________
>>> 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
>>>
>>>
>>>       
>>
>> ______________________________________________
>> 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
>>
>>     
>
>
>
>   




Mais detalhes sobre a lista de discussão lista