4. Utilizando Triggers e Generators

Neste capítulo, abordaremos dois assuntos bastante interessantes e importante presente no IB/FB. Triggers e Generators são objetos fundamentais na manutenção e na garantia da integridade do banco de dados. Começaremos esse capítulo conhecendo e detalhando as características e funcionalidades das Triggers dentro de um banco de dados. Na seqüência, veremos como criar e utilizar Generators em conjunto com outros objetos do banco de dados.

Uma Trigger, como uma Stored Procedure, é uma função que fica armazenada dentro do banco de dados. Podemos utilizar a mesma linguagem de programação personalizada que mostramos no capítulo sobre Stored Procedure. Em uma Trigger, podemos fazer declarações de variáveis, testes de condições, comentários, loops etc.

Ao contrário das Stored Procedures que, para serem executadas elas devem ser chamadas explicitamente, uma Trigger é disparada (executada) automaticamente quando certos tipos de eventos ocorrem dentro das tabelas do banco de dados. Uma Trigger sempre está vinculada a uma tabela ou View do banco de dados.

Todo o código adicionado dentro de uma Trigger é executado dentro do próprio banco, isso é, todo o processamento é realizado no servidor e não na máquina cliente. Essa característica torna uma Trigger, como também é o caso das Stored Procedures, extremamente rápidas. Além de suportar todas as instruções SQL do tipo DML (Insert, Update e Delete), através de uma Trigger podemos também fazer chamadas a Stored Procedures criadas no banco de dados.

Nota: Triggers não suportam instruções DDL (Create, Alter, Drop), isso é, você não pode criar, alterar ou excluir objetos do banco de dados através de uma Trigger.

Utilização de Triggers

Através de Triggers, podemos executar determinadas operações sempre que determinados eventos ocorrem em uma tabela ou View. Esses eventos são:

·         Before Insert: Antes de uma nova linha ser incluída em uma tabela ou View;

·         After Insert: Após uma linha ter sido inserida em uma tabela ou View;

·         Before Update: Antes de uma linha ser alterada em uma tabela ou View;.

·         After Update: Após uma linha ter sido alterada em uma tabela ou View;

·         Before Delete: Antes de uma linha ser excluída de uma tabela ou View;

·         After Delete: Após uma linha ter sido excluída de uma tabela ou View;

Durante a definição da Trigger, podemos especificar qual evento será responsável em executá-la. Podemos utilizar uma Trigger, por exemplo, para ser disparada antes de uma linha ser inserida na tabela. Dessa forma, podemos validar os dados que serão inseridos, sendo que, caso eles não estejam consistentes ou completos, podemos interromper a operação de inserção.

Outra situação interessante para utilizar uma Trigger é no momento em que uma linha esta para ser apagada de uma tabela. Nesse momento, podemos verificar se o registro a ser excluído não possui uma chave primária de um relacionamento um para muitos. Através da Trigger, verificamos se existem registros relacionados na tabela de chave estrangeira, podendo então excluí-los automaticamente antes de excluir o registro em questão ou ainda interromper a exclusão.

Sem dúvida alguma, as Triggers são utilizadas com mais freqüência para gerar um valor para a chave primária da tabela no momento em que uma nova linha é inserida. Caso a tabela possua um campo chave para armazenamento de um valor único, através da função Gen_Id, podemos criar e armazenar um valor único no campo antes de inserir efetivamente a linha na tabela.

Uma situação também bastante comum para o uso de Triggers é para a geração de uma tabela de histórico, onde nela podemos armazenar todas as mudanças ocorridas em alguma tabela crítica do banco de dados.

Criando Triggers

 Podemos criar uma Trigger diretamente no editor SQL da ferramenta que utilizamos para gerenciar nosso banco de dados. Ferramentas como o IBConsole e IBExpert trazem consigo interfaces visuais para facilitar a criação e manutenção de Triggers. Para criar uma Trigger devemos utilizar a instrução Create Trigger.

 

CREATE TRIGGER NOME_DA_TRIGGER

FOR NOME_DA_TABELA EVENTO_DISPARO POSICAO

AS

LISTA_DE_VARIAVEIS_LOCAIS

BEGIN

  CORPO_DA_TRIGGER

END;

 

Para a seção Nome_da_Trigger, devemos definir um nome único para a Trigger, isso é, esse nome deve ser único entre todos os objetos criados dentro do banco de dados. Para a seção Nome_da_Tabela, devemos especificar em qual tabela a Trigger ficará vinculada. Como comentado anteriormente, ao definirmos uma Trigger devemos especificar qual tabela (ou View atualizável) utilizará a Trigger; isso é, quando um determinado evento ocorrer nessa tabela, a Trigger será disparada (executada). Na seção Evento_Disparo devemos especificar qual evento da tabela será responsável em disparar a Trigger. 

Nota. O uso da seção Nome_da_Tabela e Evento_Disparo são obrigatórios dentro de uma Trigger.

Na seção Posicao, podemos definir em qual ordem a Trigger será disparada, isso é, o IB/FB permite a definição de uma ou mais Triggers para o mesmo evento em uma mesma tabela. Através dessa seção, podemos numerar as Triggers afim de dizer em qual ordem as mesmas devem ser especificadas. Esse parâmetro é definido sempre com valores múltiplos de 5, onde, a ordem de execução vai do valor mais baixo para o mais alto. Exemplo: 0, 5, 10, 15, 20 etc.

Nota: Você não é obrigado a utilizar valores múltiplos de cinco, porém, esse é o padrão utilizado para os bancos IB/FB, e esse espaço entre os números permite que possamos adicionar novas Triggers entre Triggers já existentes no futuro.

...

Quer ler esse conteúdo completo? Tenha acesso completo