quarta-feira, 28 de setembro de 2011

Campo auto incremento no Firebird usando isql (Generator + Trigger)


Hoje vamos criar um campo auto incremento usando Generator e Trigger no Firebird, com o isql.

O que faremos é o seguinte, criar um GENERATOR para armazenar um valor para o campo ID da tabela depois um Gatilho para alterar o novo valor de ID quando inserirmos o registro.

Vamos abrir um terminal como root no Linux ou o Prompt de comando no Windows.

Abra a ferramenta isql com o comando

# no Linux
isql-fb


Agora vamos criar o banco de dados:

CREATE DATABASE “/home/alex/firebird_data/tutorial2.fdb” user “SYSDBA” password “senha”;

Criamos também a tabela:

CREATE TABLE TESTE_AI(
ID INTEGER NOT NULL PRIMARY KEY,
NOME VARCHAR(50) NOT NULL,
IDADE INTEGER NOT NULL
);

Agora vamos à criação do GENERATOR que controlará o auto incremento de ID.

CREATE GENERATOR GEN_ID_TESTE_AI;

O comando para a criação de Generators é simples:

CREATE GENERATOR NOME_GENERATOR;

Eu costumo usar GEN + Nome do campo + tabela, mas fica a cargo de cada um a escolha deste nome.

Agora vamos criar um Gatilho que vai incrementar o valor do ID.

Antes, vamos alterar o terminador padrão, que é “;” para outro caractere que não será usado no bloco de código do gatilho, no caso vou colocar um “!”. Qualquer outro caractere pode ser usado, mas você deve ter muito cuidado aqui, pois se usar algum que apareça no meio do caminho, seu comando será fechado e todo seu trabalho será perdido.

Usamos o comando SET TERM + o novo caractere que usaremos (no caso o “!”) e fechamos com o caractere terminador atual, no caso o “;”.

SET TERM !;

CREATE TRIGGER T_G_ID_TESTE_AI
FOR TESTE_AI
ACTIVE
BEFORE INSERT
POSITION 0
AS
BEGIN
     NEW.ID = GEN_ID(GEN_ID_TESTE_AI, 1);
END!


Nesta primeira linha crio o Gatilho, dando um nome para ele, no caso, usei o T (trigger) + G (porque ele está associado a um Generator), + Campo + Tabela).

CREATE TRIGGER T_G_ID_TESTE_AI

Na segunda linha uso o FOR para mostrar a qual tabela ele está relacionado, no caso TESTE_AI.

FOR TESTE_AI

Digo que quero que este Gatilho esteja ativado.

ACTIVE

Ele será executado antes de Inserir, quando executamos o comando Insert, antes dos dados serem salvos no banco, ele executa este comando.

BEFORE INSERT

Agora digo que ele será o primeiro a ser executado, isto é preciso quando temos mais de um gatilho sendo executado no mesmo ponto de alteração, então se eu tivesse outro gatilho nesta tabela para ser executado em BEFORE INSERT, eu uso este comando para controlar o fluxo de execução. POSITION 0 para o primeiro, POSITION 1 para o segundo, etc...

POSITION 0

Inicio o bloco de comandos

AS
BEGIN

Altero o valor do novo ID para o valor armazenado no Generator incrementando 1 ao mesmo usando GEN_ID.

Veja que aqui nesta linha, eu preciso fechá-la com o “;”, se não tivéssemos alterado o terminador de linha, o comando SQL seria fechado neste momento de forma incompleta e perderíamos todo o trabalho.

NEW.ID = GEN_ID(GEN_ID_TESTE_AI, 1);

Agora fecho o comando, veja que para fechar o comando SQL, agora eu uso o novo terminador que escolhemos no início do comando.

END!

Para não mantermos este terminador para os próximos comandos voltamos o mesmo para o “;”.

SET TERM ;!

Vamos testar o comando inserindo alguns valores:

INSERT INTO TESTE_AI VALUES(NULL, 'TESTE', 20);
INSERT INTO TESTE_AI VALUES(NULL, 'TESTE1', 20);
INSERT INTO TESTE_AI VALUES(NULL, 'TESTE2', 20);
INSERT INTO TESTE_AI VALUES(NULL, 'TESTE3', 20);
INSERT INTO TESTE_AI VALUES(NULL, 'TESTE4', 20);

Agora selecione os valores.

SELECT * FROM TESTE_AI;

Se alguma coisa der errada, tente refazer cada passo, entendendo o porque de cada comando.

Até a próxima.

0 comentários:

Postar um comentário