Emulação de seqüências com DataServer SQL Server

Escrito por Marcos Kirchner em 26 de março de 2009, 11:32h

O OpenEdge, assim como vários outros bancos de dados, dispõe de um objeto nativo no banco de dados chamado seqüencia (SEQUENCE). A função deste objeto é gerar números incrementais (em incrementos positivos ou negativos) e garantir que os número gerados não sejam repetidos, mesmo que a seqüência seja utilizada concorrentemente por vários processos.

No SQL Server, não existe um objeto do tipo seqüência. Os números sequenciais são gerados automaticamente pelo servidor quando define-se a propriedade IDENTITY em uma coluna numérica.

A ausência de seqüências no SQL Server é um fator que gera muita confusão quando se utiliza o DataServer, pois os programas 4GL / ABL que usam seqüências funcionam normalmente. Para manter esta compatibilidade o DataServer cria uma tabela e uma Stored Procedure (SP) no SQL Server para cada seqüência existente no banco OpenEdge. Para o programador esta emulação é transparente, não há necessidade de alterar o programa.

Os objetos gerados pelo DataServer têm o nome _SEQT_<nome seqüência> e _SEQP_<nome seqüência>. Por exemplo, a seqüência Next-Cust-Num do banco sports, ao ser convertida pelo DataServer vai gerar uma tabela de nome _SEQT_next_cust_num e uma SP de nome _SEQP_next_cust_num. Em um banco de dados com 50 seqüências, serão geradas 50 tabelas e 50 SPs.

Na tabela são armazenados as propriedades (valor inicial, valor máximo, incremento) e o valor atual da seqüência. Esta tabela sempre tem 5 colunas e sempre deverá ter 1 registro. Se a tabela não tiver registros ou tiver mais do que 1 registro, ocorrerão erros quando o programa pedir um valor de seqüência.

A função da SP é gerar o novo valor incremental e retorná-lo para a aplicação. A mesma SP também suporta as operações de leitura do valor atual da seqüência (CURRENT-VALUE) e alteração do valor atual (ASSIGN CURRENT-VALUE).

Sempre que um programa 4GL / ABL utiliza uma seqüência, com as funções NEXT-VALUE, DYNAMIC-NEXT-VALUE, CURRENT-VALUE ou DYNAMIC-CURRENT-VALUE, o DataServer gera, internamente, uma chamada à Stored Procedure para realizar a operação correspondente.

O manual do Dataserver SQL possui mais detalhes sobre o funcionamento das seqüências quando utilizadas com bancos SQL Server.

Categorias: DataServer | Internals | Segurança

Tags: , ,

Comentar




biuquote
  • Comentário
  • Pré-visualização
Loading