Sequências
14/12/2004
0
Atualmente, trabalho com Generators para controlar minha sequencias no Banco de Dados. Utilizo as triggers no evento Before Insert e a função GEN_ID() para realizar o incremento do Generator. Beleza...
Problema: Os Generator são do tipo INTEGER, ou seja, suportam 123456789 dígitos, no máximo. Convenhamos que para sequência é muito pouco.
Tive a idéia de criar uma tabela:
SEQUENCIA( NOME VARCHAR(45), VALOR_ATUAL NUMERIC(18) )
E através desta tabela controlarei minha sequências (Agora com o dobro de dígitos para armazenamento com o NUMERIC(18)).
Surgem as dúvidas:
1) Como controlar o incremento dos valores para cada sequência? (Criei uma procedure SEQUENCIA, que recebe como parâmetros o nome da sequência e o valor de incremento; dentro dela dou um UPDATE na tabela de SEQUENCIA, no VALOR_ATUAL da respectiva SEQUENCIA. Desta maneira eu terei algum problema caso, ocasionalmente, ocorra de dois clientes atualizarem a mesma sequência ao mesmo tempo? O Interbase 7.1 controla as transações automaticamente nas procedures e triggers?)
[]´s
Michaell
Posts
14/12/2004
Gandalf.nho
15/12/2004
Michaell
Desculpe-me, mas creio que não foi esta a minha pergunta...
Tive a idéia de criar uma tabela: SEQUENCIA( NOME VARCHAR(45), VALOR_ATUAL NUMERIC(18) ) E através desta tabela controlarei minha sequências (Agora com o dobro de dígitos para armazenamento com o NUMERIC(18)). Surgem as dúvidas: 1) Como controlar o incremento dos valores para cada sequência? (Criei uma procedure SEQUENCIA, que recebe como parâmetros o nome da sequência e o valor de incremento; dentro dela dou um UPDATE na tabela de SEQUENCIA, no VALOR_ATUAL da respectiva SEQUENCIA. Desta maneira eu terei algum problema caso, ocasionalmente, ocorra de dois clientes atualizarem a mesma sequência ao mesmo tempo? O Interbase 7.1 controla as transações automaticamente nas procedures e triggers?) []´s
15/12/2004
Gandalf.nho
15/12/2004
Michaell
Beleza... Mas o meu problema está no controle desta transação... Por exemplo:
Possuo a tabela:
REGISTROS(CODIGO INTEGER NOT NULL, NOME VARCHAR(50) NOT NULL)
Esta tabela possui como chave primária o campo CODIGO, e como índice UNIQUE o campo NOME.
Hipoteticamente duas máquinas clientes irão cadastrar um mesmo registro (´REGISTRO1´) na tabela. Atualmente na tabela SEQUENCIA eu tenho:
NOME VALOR ATUAL
REGISTRO 5
No Delphi 7 estou utilizando DBExpress e DBControls, então iniciei uma transação em um procedimento para retornar o valor da sequência. Problema: As duas máquinas estão acessando ao mesmo tempo o registro de SEQUENCIA para incrementar o valor... E tem mais uma... Tentando inserir em um índice único o mesmo ´nome´.
Como resolver esse problema?
15/12/2004
Gandalf.nho
No caso do primeiro problema, a única maneira de resolver seria interceptar a chave duplicada e incrementar novamente uma delas até conseguir um valor único (é o lado negativo de não usar generator). No caso da chave única, o sistema não tem como saber se a chave é duplicada até os dois postarem suas alterações, principalmente se estiver usando ClientDataSet, em que a comparação só ocorrerá na hora do ApplyUpdates.
Clique aqui para fazer login e interagir na Comunidade :)