Autonumber em GeneXus com ORACLE

Quando marcamos um atributo como Autonumber = True em GeneXus com ORACLE, GeneXus cria 2 objetos no schema de Banco de Dados que definimos como usuário.
Estes objetos são:

1 Sequence
1 Trigger

Algo tipo assim:

CREATE SEQUENCE Nome_Atributo
START WITH 1
MAXVALUE 999999999999999999999999999
MINVALUE 1
NOCYCLE
CACHE 20
NOORDER;

CREATE OR REPLACE TRIGGER AN$NNNNome_Atributo BEFORE INSERT ON Tabela_Atributo
FOR EACH ROW
BEGIN SELECT Nome_Atributo.NEXTVAL INTO :new.Nome_Atributo FROM DUAL; END;
/

Onde em AN$NNNNome_Atributo:

NNN = O número interno do Atributo na Base de Conhecimento GeneXus
Nome_Atributo = Nome que usamos para o Atributo em nossa TRN.

e Tabela_Atributo é o nome de Tabela que corresponde a nossa TRN em GeneXus.

A grande debilidade deste script usando a SEQUENCE está no CACHE.

Existem alguns problemas relatados com Sequence em ORACLE fazendo referência ao CACHE utilizado, e a prova está que se olhamos os identificadores internos de nossas tabelas criadas com GeneXus em ORACLE a medida que vamos inserindo registros vemos que estos Identificadores não são sempre uma sequência perfeita. Os números começam a pular, exemplo:

de 101,102,103, passa para 122,123, etc.

Uma alternativa que temos usado para corrigir isto, é alterar o CACHE de oracle para 2, simplesmente em sqlplus, usando o comando:

ALTER SEQUENCE Nome_Atributo CACHE 2;

Com isto evitamos que ORACLE reserve 20 números para esta SEQUENCE e depois por algum problema fique esse buraco em nossos identificadores.

Agora bem, quando temos muitas TRNs e queremos alterar o CACHE de todas, como fazemos?

Bem, o que devemos fazer nesse casso é montar um pequeno script que lendo o dicionário de ORACLE nos informe todas as sequences que temos criadas e anexando o texto que completa o comando nos daria como resultado nosso script.

Então o que fazemos é o seguinte:

Conectado ao sqlplus, com um usuário que tenha acesso ao Dicionário de Dados de Oracle e a vista User_sequences executamos o seguinte comando:

SELECT ‘ALTER SEQUENCE ‘||SEQUENCE_NAME||’ CACHE 2;’ FROM USER_SEQUENCES;

Cuidado em respeitar os espaços para que o texto resultado seja correto.
A saída deste select seria algo assim:

ALTER SEQUENCE Nome_Atributo1 CACHE 2;
ALTER SEQUENCE Nome_Atributo2 CACHE 2;
ALTER SEQUENCE Nome_Atributo3 CACHE 2;
ALTER …

onde Nome_Atributo1, 2, 3 … são os nossos atributos que foram criados como autonumber em todas nossas TRNs GeneXus.

Seu usuário não tem direito ao dicionário de ORACLE?
De permissões momentâneas de DBA ao seu usuário e quando se conecte de novo ao Banco de dados, vai conseguir.

Para dar essas permissões, conectado como System execute GRANT DBA to Usuário_Schema;

Onde Usuário_Schema é o usuário que você configura no GeneXus nas DBMS Options.

Espero este post seja de ajuda a Comunidade GeneXus.

Fabricio De los Santos
Gerência de Projetos – Consultoria GeneXus – Agente K2B Tools

Veja meus blogs em:
www.fabriciodelossantos.com

 

“Produtividade ao 300% com GeneXus e …”



As K2BTools são um conjunto de ferramentas que conjugadas a GeneXus, colaboram fortemente no desenvolvimento de Aplicações Web ou na sua conversão desde ambientes Win ou telas de texto plano. Conte com Fabricio De los Santos, Agente K2B Tools, com 15 anos de experiência internacional em GeneXus, para tirar qualquer dúvida e seja mais PRODUTIVO.

Deja un comentario