Manipulando Triggers no PostgreSQL

Olá novamente caros leitores!

Primeiramente me desculpem pela demora para liberar uma nova postagem sobre o Postgres, é que as últimas semanas foram muito movimentadas, realizei minha entrevista na UFSCar para o ingresso no programa de mestrado do Departamento de Computação e ainda na semana retrasada recebi a notícia da minha aprovação, então imaginem o tamanho da felicidade e a correria com as festas de fim de ano.

Bom, mas vamos ao que interessa, hoje irei falar sobre as triggers, ou funções de gatilho, como você queria chamar. Uma das coisas mais interessantes da implementação das funções no Postgres é que você pode escolher qual linguagem vai usar para programar sua trigger! Isso mesmo, então antes de mais nada, eu separei abaixo a lista de algumas linguagens, e o link para mais informações sobre elas, veja:

Agora que você já sabe dessa maravilha do Postgres irei dizer que aqui, iremos exemplificar as triggers utilizando a PL/pgSQL. Mas antes da prática no código fonte, iremos trabalhar um pouco sobre a definição e funcionamento das triggers no PostgreSQL.

Você deve saber que os nossos gatilhos funcionam baseados em eventos, dois: before (antes de alguma coisa) e after (depois de alguma coisa). Explicando: você pode determinar que uma trigger dispare após (after) a inserção em determinada tabela do banco ou antes (before) da tal inserção, por exemplo.

É muito importante que você dê uma olhada abaixo na lista de variáveis que podem ser utilizadas dentro da estrutura da função da sua trigger, vale a pena dar uma lida, no entanto existem duas que a leitura é obrigatória, que são a new e a old. Elas são usadas da seguinte maneira:

  • NEW: No caso da trigger ser disparada por um INSERT a variável NEW irá abrigar os valores a ser inseridos, e caso seja um evento do tipo UPDATE, NEW irá conter a nova versão dos valores a serem atualizados (veja o exemplo no código abaixo).
  • OLD: Esta variável é utilizada no caso do evento DELETE armazena os dados que estão sendo excluídos, e no caso do UPDATE a versão antiga dos dados.

O acesso dos dados se dá em ambas as variáveis dessa maneira: NEW.COD_CLIENTE, por exmplo. Abaixo você verá o exemplo de uma trigger.

Outras variáveis especiais que você pode usar:

  • TG_NAME: Contém o nome do trigger que foi disparado.
  • TG_WHEN: Contem quando o evento foi disparado, sendo BEFORE ou AFTER.
  • TG_LEVEL: Diz em qual ponto da trigger.
  • TG_OP: Tipo de operção que está sendo executada: INSERT, UPDATE ou DELETE.
  • TG_RELID: Contém a ID do objeto que está disparando o gatilho.
  • TG_RELNAME: Nome da tabela que disparou o gatilho (obsoleto).
  • TG_TABLE_NAME: Nome da tabela que disparou o gatilho.
  • TG_NAME_SCHEMA: Nome do schema onde está a tabela que disparou a trigger.
  • TG_NARGS: Número de argumentos fornecidos para a Stored Function do trigger.
  • TG_ARGV[]: Os argumentos que foram fornecidos.

Perguntas (quase) nunca feitas sobre triggers:

  • Sabe-se que pode atrelar mais de uma trigger por tabela, então qual a ordem de execução das triggers?
    R: A ordem de execução é alfabética.
  • Triggers podem ser recursivas?
    R: Sim! Os gatilhos podem executar comandos SQL, e os mesmos podem disparar outras triggers. Este cenário é conhecido como cascateamento de triggers, assim pode ser que a trigger passe a se “auto disparar”, ou seja, chamadas recursivas da própria trigger, fique atento a recursões infinitas!

CRIAÇÃO DE UMA TRIGGER

Agora vamos a parte pática irei realizar um único exemplo, neste link você e encontrar mais exemplos de triggers. No nosso, considere as duas tabelas abaixo:

Repare que na construção da tabela funcionarios eu não coloquei nenhuma regra de validação, como por exemplo not null, foi de propósito! Nossa trigger irá realizar a (simples) validação da entrada de dados na tabela e em seguida guardar que tipo de operação foi feita, por quem e a data na tabela funcionarios_log.

Agora a construção da stored function que será “chamada” pela trigger e sua agregação como trigger:

Note que realizei as devidas validações utilizando o operador NEW, porque agora iremos atrelar a trigger a tabela dizendo que ela será executada durante um insert ou update. Observe também que o declaramos um return “trigger” e especificamos os delimitadores $$, você pode encontrar mais informações sobre a estruturação de procedures de triggers na documentação do PostgreSQL, e por fim note que especificamos qual linguagem é utilizada para a construção da trigger, no caso plpgsql.

Veja abaixo como definimos a trigger, chamando a procedure que construímos anteriormente:

Pronto! Agora sua trigger já está funcionando nos eventos INSERT e UPDATE na tabela funcionários, faça os testes!

 

PARA ALTERAR UMA TRIGGER  QUE JÁ EXISTA

Repare que não postei a imagem dos resultados para induzir você a testar o código! Faça os scripts de insert e update e veja as saídas produzidas pelo SGBD, acredito que você irá se divertir muito com os resultados!

Se você quiser saber mais sobre os triggers e sobre o PostgreSQL eu recomendo um livro (se você também for chegado a papel) que utilizei na minha monografia, intitulado PostgreSQL: Guia do Desenvolvedor, de André Milani.

Como você que leu (conseguiu chegar até aqui) triggers são um assunto muito extenso para se tratar aqui no blog, recomendo que você leia as referências e pesquisa mais sobre o assunto, é um tema muito interessante e útil para o dia a dia!

Referências:

Abraços,

Tiago

Download da minha Monografia

Olá meus Leitores!

Estou disponibilizando para vocês o download da minha monografia, que apresentei para a obtenção do título de Tecnólogo em Informática para Gestão de Negócios pela Fatec Mococa em 2010.

Claro que o objetivo de eu estar colocando ela aqui é para consulta e pesquisa, nada de plágio porque nenhum professor é bobo ok?

O trabalho intitulado “E-business, uma abordagem sobre o business-to-business com o desenvolvimento de uma plataforma de negócios baseado na metodologias Web 2.0“, sob a orientação do Prof. MSc. Geraldo Henrique Neto.

Veja o resumo do trabalho:

Este estudo busca realizar uma investigação sobre o funcionamento da classe B2B
(Business-to-Business), termo contido no conceito de e-Business, que por sua vez
foi abordado em uma análise que teve por escopo identificar e expor termos como
e-ERP, e-CRM, e-SCM, e-Procurement, e-BI, e e-Commerce. Em seguida investigase
os impactos da implantação do e-Business na organização, com ênfase na classe
B2B, quando aborda-se ainda os aspectos envolvidos na terceirização da
implantação do conceito. E por fim, como componente da análise busca-se
desenvolver um modelo de plataforma B2B on-line, que sugere uma alternativa para
as interações entre empresas, ou seja, a empresa com seus fornecedores ou
parceiros, durante o desenvolvimento buscou-se utilizar metodologias de
desenvolvimento web 2.0, juntamente com alternativas open source, tais como PHP
(Hypertext Processor) e PostgreSQL.
Palavras-chave: e-Business. Business-to-Business. Modelo. Plataforma. Web 2.0.

Você pode fazer o download clicando aqui!

Espero que seja útil!

Abraços,

Tiago.

 

Mestrado na UFSCar? Tô dentro!

Meus Amigos!

Hoje é um dia de muita felicidade! Hoje meu nome estava entre os que foram aprovados para o Programa de Mestrado 2012 do Departamento de Computação da Universidade Federal de São Carlos!

Não tenho palavras para representar a alegria que sinto! Depois de tantas batalhas, paciência, estudo, ansiedade, enfim a recompensa! Irei fazer mestrado em Engenharia de Software, realmente estou muito feliz!



No momento em que soube pelo da minha aprovação pelo site do Departamento, e logo após minha vibração (!!!) liguei para todos os que me ajudaram e contribuíram para minha chegada até a UFSCar! Um abraço especial para Prof. Dr. Darlan Marcelo Delgado que foi o responsável pela minha iniciação científica, para o Prof. Dr. Jean Miler Scatena  que me orientou muito e forneceu cartas de recomendação, para o meu orientador nos tempos de monografia, Prof. MSc Geraldo Henrique Neto que aconselhou sobre a vida acadêmica e que sempre esteve presente quando precisei de cartas de recomendação e para o Prof. MSc. Fernando Duarte que me apoiou e me incentivou especialmente para o mestrado na UFSCar, também fornecendo cartas de recomendação. Meu muito obrigado a todos vocês e a todos os outros professores que fizeram parte até agora da minha trajetória acadêmica.

E claro não posso deixar de agradecer, do fundo do meu coração minha Mãe, Dona Helena, Meu Pai Sr Antônio e minha namorada Letícia que tanto me apoiaram na fase de estudos e seleção, além dos meus amigos mais próximos que sempre ouviram meus planos sobre a vida acadêmica, mais uma vez muito obrigado!

Realmente agora é um tempo de muita alegria, mas também de pensar em todo o trabalho de pesquisa que terei pela frente, e é claro ele também será postado aqui junto com o meu dia a dia na Universidade! Espero que todos que estejam acompanhando o blog apreciem essa minha nova empreitada e sorte a todos nós em 2012, que esse ano já vai se iniciar prometendo muito!

Muito obrigado a todos que estavam torcendo por mim!

Abraços,

Tiago.