38.3. Exemplo completo de gatilho de evento #

A seguir está um exemplo muito simples de uma função de gatilho de evento escrita em C. (Exemplos de gatilhos de eventos escritos em linguagens procedurais podem ser encontrados na documentação das linguagens procedurais.)

A função noddl lança uma exceção toda vez que é chamada. A definição do gatilho de evento associa a função ao evento ddl_command_start. O efeito é que todos os comandos de DDL (com as exceções mencionadas em Visão geral do comportamento de gatilho de evento) são impedidos de executar.

Este é o código-fonte da função de gatilho

#include "postgres.h"
#include "fmgr.h"
#include "commands/event_trigger.h"

PG_MODULE_MAGIC;

PG_FUNCTION_INFO_V1(noddl);

Datum
noddl(PG_FUNCTION_ARGS)
{
    EventTriggerData *trigdata;

    if (!CALLED_AS_EVENT_TRIGGER(fcinfo))  /* erro interno */
        elog(ERROR, "não foi chamada pelo gerenciador de gatilho de evento");

    trigdata = (EventTriggerData *) fcinfo->context;

    ereport(ERROR,
            (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
             errmsg("comando \"%s\" negado",
                    GetCommandTagName(trigdata->tag))));

    PG_RETURN_NULL();
}

Após compilar o código-fonte (veja Compilação e ligação de funções carregadas dinamicamente), são declarados a função e o gatilho [121]:

CREATE FUNCTION noddl() RETURNS event_trigger
    AS 'noddl' LANGUAGE C;

CREATE EVENT TRIGGER noddl ON ddl_command_start
    EXECUTE FUNCTION noddl();

Agora o funcionamento do gatilho pode ser testado:

=# \dy
                     Lista de gatilhos de evento
 Nome  |      Evento       |   Dono   | Ativado | Função | Marcadores
-------+-------------------+----------+---------+--------+------------
 noddl | ddl_command_start | postgres | ativado | noddl  |
(1 linha)

=# CREATE TABLE foo(id serial);
ERRO:  comando "CREATE TABLE" negado

Nesta situação, para poder executar alguns comandos de DDL quando necessário, será necessário excluir o gatilho de evento ou desativá-lo. Pode ser conveniente desativar o gatilho apenas durante a transação:

BEGIN;
ALTER EVENT TRIGGER noddl DISABLE;
CREATE TABLE foo (id serial);
ALTER EVENT TRIGGER noddl ENABLE;
COMMIT;

(Lembre-se de que os comandos de DDL nos próprios gatilhos de evento não são afetados pelos gatilhos de evento.)



[121] O código-fonte da função, o arquivo Makefile, o comando CREATE FUNCTION, que vincula a função C à função SQL, e demais comandos SQL, podem ser vistos em Exemplo completo de gatilho de evento em C (NO DDL) no GitLab. (N. T.)