Trigger no PostgreSQL

 

Um sistema de log usando trigger no PostgreSQL

 

Olá,

 

nos artigos anteriores escrevemos sobre stored procedures ou procedimentos armazenados no PostgreSQL, neste, vamos tratar dos triggers ou gatilhos. Na verdade, um gatilho também é um procedimento armazenado, a diferença é que ele é um procedimento que, ao invés de ser chamado como os que vimos anteriormente (ex. Select procedimento()), é executado quando um dado evento ocorre. Ou seja, ao ocorrer o evento o gatilho é disparado e o procedimento armazenado é executado.

 

Neste artigo vamos criar um sistema de “log” no PostgreSQL. O sistema deve armazenar em uma tabela log todas as alterações (inserção, atualização e deleção), a data em que ocorreram e o autor da alteração na tabela “alterada”.

 

Para o nosso exercício precisamos criar as seguintes tabelas no banco:

Alterada (cod serial primary key, valor varchar(50))

 

create table alterada(

cod serial primary key,

valor varchar(50)

);

 

Log (cod serial primary key, data date, autor varchar(20), alteracao varchar(6))

 

create table log(

         cod serial primary key,

         data date,

         autor varchar(20),

         alteracao varchar(6)

);

 

Como veremos a seguir, como um procedimento armazenado comum, um procedimento de gatilho no PostgreSQL também é tratado como uma função. A diferença está no tipo de dados que essa função deve retornar, o tipo especial trigger.

 

Primeiro vamos criar o nosso procedimento armazenado (function) que será executado quando o evento ocorrer. A sintaxe é a mesma já vista nos artigos anteriores, a direrença, como já dito, é o tipo de retorno trigger. Para ver mais detalhes execute o comanto \h create function no psql. A linguagem utilizada será a PL/pgSQL.

 

Nossa função de gatilho não deve receber nenhum parâmetro e deve retornar o tipo trigger.

 

create function gera_log() returns trigger as

$$

Begin

         insert into log (data, autor, alteracao) values (now(), user, TG_OP);

         return new;

end;

$$ language 'plpgsql';

 

Só pra lembrar, para criarmos uma função com a linguagem plpgsql, essa linguagem deve ter sido instalada em nosso banco através do comando “create language”.

 

Quando uma função que retorna o tipo trigger é executada, o PostgreSQL cria algumas variáveis especiais na memória. Essas variáveis podem ser usadas no corpo das nossas funções. Na função acima estamos usando uma dessas variáveis, a TG_OP que retorna a operação que foi realizada (insert, update ou delete). Existem algumas outras variáveis muito úteis como a new e a old. Minha intenção é abordá-las em um próximo artigo.

 

Para completar nosso exemplo, utilizamos as funções now e user para retornar data e hora da operação e o usuário logado respectivamente.

 

Agora precisamos criar o gatilho propriamente dito que liga a função à um evento ocorrido em uma tabela.

 

create trigger tr_gera_log after insert or update or delete on alterada

for each row execute procedure gera_log();

 

O comando acima cria um gatilho chamado tr_gera_log que deve ser executado após (after) as operações de insert, update ou delete na tabela “alterada”. Para cada linha alterada deve ser executado o procedimento ou a função gera_log().

 

Para mais detalhes executar \h create trigger no psql.

 

Vamos ver isso funcionando.

 

23-10-2007pic01.JPG 

 

Acima, após inserirmos uma linha na tabela alterada, o gatilho é disparado e insere uma linha na tabela log.

 

23-10-2007pic02.JPG 

 

Um exemplo com o comando delete e uma nova linha inserida na tabela log. O mesmo deve acontecer ao executarmos o comando update na tabela “alterada”.

 

Espero que o artigo seja útil.

 

Um grande abraço e até a próxima se Deus quiser.

 

Hesley Py