Esse artigo faz parte da revista Clube Delphi Edição 83. Clique aqui para ler todos os artigos desta edição

>

Firebird

Um guia de como e quando utilizar Generators no Firebird

 

Este artigo explica o que são os Generators do Firebird e como e por que devemos utilizá-los. Representa uma tentativa de coletar todas as informações relevantes a respeito de Generators em um único documento.

 

Quem deve ler este artigo?

Leia este artigo se você:

  • Não está familiarizado com o conceito de Generators;
  • Tem dúvidas de como utilizá-lo;
  • Quer criar um campo ID no estilo “auto-incremento” como visto em outros banco de dados;
  • Está procurando exemplos de como utilizar Generatos para incrementar campos;

 

O que é um generator?

Imaginemos um Generator como um contador de números inteiros residente em um banco de dados Firebird. Poderemos criar um Generator e ao mesmo tempo atribuir-lhe um nome, com a seguinte declaração:

 

CREATE GENERATOR GenTest;

 

A seguir podemos obter o seu valor atual, incrementá-lo ou decrementá-lo como faríamos com um var i: integer em Delphi, porém, não é fácil configurá-lo diretamente com certo valor de um modo previsível e a seguir obter o mesmo valor. Ele encontra-se no banco de dados, porém, fora do controle da transação.

 

O que é uma Sequence?

O termo Sequence é a designação oficial SQL para o que o Firebird chama de Generator. Como a equipe do Firebird está constantemente se esforçando para melhor se enquadrar no padrão SQL, o termo SEQUENCE pode ser utilizado como sinônimo de GENERATOR no Firebird 2 e superior. De fato, é recomendável a utilização da sintaxe SEQUENCE, quando formos escrever novo código.

Embora a palavra Sequence ponha a ênfase na série de valores gerados, ao passo que Generator parece referir-se principalmente ao mecanismo fonte que produz esses valores, não existe em absoluto nenhuma diferença entre um Generator e uma Sequence. São apenas duas palavras para nos referirmos ao mesmo recurso do banco de dados.

Podemos criar um Generator e acessá-lo utilizando a sintaxe de Sequence e vice-versa. A seguir, temos a sintaxe preferencial para criarmos um Generator/Sequence no Firebird 2:

 

CREATE SEQUENCE SeqTest;

 

Onde são armazenados os Generators?

As declarações dos Generators são armazenadas na tabela de sistema RDB$GENERATORS. Os seus valores, no entanto, são armazenados em páginas reservadas especiais dentro do banco de dados. Nunca teremos acesso a esses valores diretamente, e sim por meio de funções e declarações embutidas que serão abordadas mais adiante.

 

Obs.: As informações fornecidas nessa seção têm objetivos educacionais somente. Como regra geral, não devemos “mexer” com as tabelas do sistema. Não devemos tentar criar ou alterar Generators escrevendo diretamente na tabela RDB$GENERATORS (o acesso mediante declarações SELECT, no entanto, não tem nenhuma contra-indicação).

 

A estrutura da tabela de sistema RDB$GENERATORS é a seguinte:

 

RDB$GENERATOR_NAME CHAR(31)

RDB$GENERATOR_ID SMALLINT

RDB$SYSTEM_FLAG SMALLINT

 

E ainda, no Firebird 2.0:

 

RDB$DESCRIPTION BLOB subtype TEXT

 

Observar que o GENERATOR_ID é, como o nome diz, um identificador para cada Generator e não o seu valor. Também, não devemos permitir que nossas aplicações armazenem o identificador do generator para utilização posterior. Além de não fazer sentido, o ID pode ser modificado após um ciclo de backup/restore. O SYSTEM_FLAG é 1 para Generators utilizados internamente pelo engine do servidor e NULL ou 0 para aqueles criados pelo usuário.

Agora daremos uma olhada na tabela RDB$GENERATORS, aqui com um simples Generator auto-definido, conforme vemos na Tabela 1.

 

RDB$GENERATOR_NAME

RDB$GENERATOR_ID

RDB$SYSTEM_FLAG

RDB$SECURITY_CLASS

1

1

SQL$DEFAULT

...
Quer ler esse conteúdo completo? Tenha acesso completo