[firebase-br] AutoIncremento

Nilton Souza ntn em bbs2.sul.com.br
Seg Out 4 16:05:06 -03 2004


Olá Evandro,

Eu uso os generators em tabelas onde não existe nenhum problema em perder a
numeração e quando existe a necessidade de manter a sequência da numeração
eu utilizo uma tabela de controle a qual submeto ao contexto transacional,
assim ela irá ficar em "lock" até que seja efetuado um commit ou rollback
evitando que outro usuário pegue o mesmo número. Porém tome cuidado com isso
pois você pode facilmente gerar queda de performance ou até deadlock's,
sugiro que você reduza ao máximo o tempo de vida de suas transações.

A estrutura da minha tabela de controle é mais ou menos assim:

CREATE TABLE Tabelas (
    Nome VARCHAR(30) NOT NULL,
    ProximoId INT DEFAULT 1 NOT NULL
);

ALTER TABLE Tabelas ADD Primary Key PK_Tabelas (Nome);


Então eu tenho uma SP chamada sp_proximo_id com essa estrutura:

set term !! ;
create or alter procedure sp_proximo_id(TabNome varchar(30))
returns(Id integer)
as
begin
  select ProximoId
  from TABELAS
  where upper(Nome) = upper(:TabNome)
  into :Id ;

  if (:Id is not null and :Id > 0) then
  begin
    update TABELAS
    set ProximoId = ProximoId + 1
    where upper(Nome) = upper(:TabNome);
  end
  else
    Id = -1;

  suspend; /* USE O SUSPEND SE VC QUISER PEGAR O ID ATRAVÉS DE SELECT's */
end !!
set term ; !!

Exemplo de utilização:

SQLConnection.StartTransaction(TransDesc);

     >> Executa SP sp_proximo_id e pega o ID
          (observe que a chamada é feita dentro do escopo transacional)

     >> Inclui o cliente

SQLConnection.Commit(TransDesc);

[]'s
Nilton Souza



----- Original Message -----
From: "Evandro Bastiani" <evandrobastiani2 em hotmail.com>
To: "FireBase" <lista em firebase.com.br>
Sent: Monday, October 04, 2004 3:38 PM
Subject: [firebase-br] AutoIncremento


Até agora, depois de ver tantas opiniões não cheguei a uma conclusão de qual
forma melhor de se fazer um numero autoincremental.
Gerar manualmente acrescentando mais 1 a variavel não me agradou pelo fato
de correr um grande risco de 2 usuarios inserir na mesma hora.

Trigger no After insert tem um problema, que é a perda do Numero caso
desfaça a operação de inclusão.

O correto seria um generator Before Post, só que como vou conseguir
gerenciar o gatilho no Post somente quando for Inclusão, e não para
alteração?
Idéias serão bem-vindas!!!
______________________________________________
FireBase-BR (www.firebase.com.br)
Para editar sua configuração na lista, use o endereço
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br






Mais detalhes sobre a lista de discussão lista