O PL/Perl pode ser usado para escrever
funções de gatilho.
Em uma função de gatilho, a referência
hash $_TD
contém informações sobre o evento de gatilho corrente.
$_TD é uma variável global, que obtém um valor
local separado para cada chamada do gatilho.
Os campos da referência hash
$_TD são:
$_TD->{new}{foo}
NEW (novo) valor da coluna foo
$_TD->{old}{foo}
OLD (antigo) valor da coluna foo
$_TD->{name}Nome do gatilho que está sendo chamado
$_TD->{event}
Evento do gatilho: INSERT,
UPDATE, DELETE,
TRUNCATE ou UNKNOWN
$_TD->{when}
Quando o gatilho foi chamado: BEFORE,
AFTER, INSTEAD OF ou
UNKNOWN
$_TD->{level}
Nível do gatilho:: ROW,
STATEMENT ou UNKNOWN
$_TD->{relid}OID da tabela na qual o gatilho foi disparado
$_TD->{table_name}Nome da tabela na qual o gatilho foi disparado
$_TD->{relname}Nome da tabela na qual o gatilho foi disparado Está em obsolescência, podendo ser removido em uma versão futura. Por favor, use $_TD->{table_name} em seu lugar.
$_TD->{table_schema}Nome do esquema onde a tabela na qual o gatilho foi disparado se encontra
$_TD->{argc}Número de argumentos da função de gatilho
@{$_TD->{args}}
Os argumentos da função de gatilho.
Não existirão, se $_TD->{argc} for 0.
Os gatilhos no nível de linha podem retornar qualquer uma das seguintes opções:
return;Execute a operação
"SKIP"Não execute a operação
"MODIFY"
Indica que a linha NEW foi modificada pela
função de gatilho
A seguir está um exemplo de função de gatilho, mostrando alguns dos itens vistos acima (veja a criação da tabela e os dados em Exemplo completo):
CREATE OR REPLACE FUNCTION validar_id() RETURNS trigger AS $$
if (($_TD->{new}{i} >= 100) || ($_TD->{new}{i} <= 0)) {
return "SKIP"; # saltar o comando INSERT/UPDATE
} elsif ($_TD->{new}{v} ne "immortal") {
$_TD->{new}{v} .= "(modificado pelo gatilho)";
return "MODIFY"; # modificar a linha e executar o comando INSERT/UPDATE
} else {
return; # executar o comando INSERT/UPDATE
}
$$ LANGUAGE plperl;
CREATE TRIGGER gat_testa_validar_id
BEFORE INSERT OR UPDATE ON test
FOR EACH ROW EXECUTE FUNCTION validar_id();