Este capítulo descreve como escrever funções de gatilho. As funções de gatilho podem ser escritas na linguagem C, ou em uma das várias linguagens procedurais disponíveis. No momento não é possível escrever funções de gatilho na linguagem SQL.
O gatilho pode ser definido para executar antes ou depois de uma operação de INSERT, UPDATE ou DELETE, tanto uma vez para cada linha modificada quanto uma vez por instrução SQL. Quando ocorre o evento do gatilho, a função de gatilho é chamada no momento apropriado para tratar o evento.
A função de gatilho deve ser definida antes do gatilho ser criado. A função de gatilho deve ser declarada como uma função que não recebe argumentos e que retorna o tipo trigger (A função de gatilho recebe sua entrada através de estruturas TriggerData passadas especialmente para estas funções, e não na forma comum de argumentos de função).
Tendo sido criada a função de gatilho adequada, o gatilho é estabelecido através do comando CREATE TRIGGER . A mesma função de gatilho pode ser utilizada por vários gatilhos.
As funções de gatilho retornam uma linha de tabela (um valor do tipo HeapTuple) para o executor que fez a chamada. Um gatilho disparado antes de uma operação possui as seguintes escolhas:
Um gatilho para disparar antes, sem intenção de causar nenhum destes comportamentos, deve ter o cuidado de retornar como seu resultado a mesma linha que foi passada (ou seja, a linha NEW para os gatilhos INSERT e UPDATE, e a linha OLD para os gatilhos de exclusão).
O valor retornado é ignorado nos gatilhos disparados após uma operação e, portanto, podem simplesmente retornar NULL.
Se mais de um gatilho for definido para o mesmo evento na mesma relação, os gatilhos serão disparados na ordem alfabética dos nomes dos gatilhos. No caso dos gatilhos para antes, a linha possivelmente modificada retornada por cada gatilho se torna a entrada do próximo gatilho. Se qualquer gatilho para antes retornar um ponteiro NULL, a operação é abandonada e os gatilhos seguintes não são disparados.
Se a função de gatilho executar comandos SQL, então estes comandos podem disparar gatilhos novamente. Isto é conhecido como gatilhos em cascata. Não existe nenhuma limitação direta do número de níveis da cascata. É possível as cascatas causarem chamadas recursivas ao mesmo gatilho; por exemplo, um gatilho INSERT pode executar um comando que insere uma linha adicional na mesma tabela, fazendo com que o gatilho INSERT seja disparado novamente. É responsabilidade do programador do gatilho evitar uma recursão infinita neste cenário.
Quando o gatilho está sendo definido, podem ser especificados argumentos para o mesmo. A finalidade de incluir argumentos na definição do gatilho é permitir gatilhos diferentes, com requisitos semelhantes, chamarem a mesma função. Como exemplo, pode haver uma função de gatilho generalizada que recebe como argumento dois nomes de coluna, coloca o usuário corrente em um e a data e hora corrente no outro. Escrita de forma apropriada, esta função de gatilho pode ser independente da tabela específica de onde é disparada. Portanto, a mesma função pode ser utilizada para eventos de INSERT em qualquer tabela com colunas apropriadas, para acompanhar automaticamente a criação de linhas na tabela de transação, por exemplo. Também pode ser utilizada para acompanhar os eventos de última atualização, se for definida em um gatilho de UPDATE.