43.6. Gatilhos no PL/Perl #

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();