Criar uma Tabela de Log e uma Função de Gatilho
Nesta etapa, você criará os objetos de banco de dados necessários para registrar eventos DDL: uma tabela para armazenar os logs e uma função que o gatilho executará.
Primeiro, abra um terminal e conecte-se ao banco de dados PostgreSQL usando o shell interativo psql. Você realizará as operações SQL subsequentes dentro deste shell.
sudo -u postgres psql
Você deverá ver o prompt do PostgreSQL, que se parece com postgres=#.
Em seguida, crie uma tabela chamada event_log para armazenar os detalhes de cada evento DDL. Esta tabela terá colunas para o horário do evento, tipo, esquema, nome do objeto e o comando que foi executado.
Execute o seguinte comando SQL no shell psql:
CREATE TABLE event_log (
event_time timestamp with time zone,
event_type text,
schema_name text,
object_name text,
command_tag text
);
Após a execução bem-sucedida, o PostgreSQL responderá com:
CREATE TABLE
Agora, crie a função que será acionada pelo evento DDL. Esta função, log_ddl_event, inserirá um novo registro na tabela event_log.
CREATE OR REPLACE FUNCTION log_ddl_event()
RETURNS event_trigger
AS $$
BEGIN
INSERT INTO event_log (event_time, event_type, schema_name, object_name, command_tag)
SELECT now(), tg_event, ddl_command.schema_name, ddl_command.objid::regclass, tg_tag
FROM pg_event_trigger_ddl_commands() AS ddl_command;
END;
$$ LANGUAGE plpgsql;
Vamos detalhar esta função:
RETURNS event_trigger: Especifica que este é um tipo especial de função projetada para ser usada com gatilhos de evento.
AS $$ ... $$ LANGUAGE plpgsql: Define o corpo da função usando a linguagem procedural plpgsql.
INSERT INTO event_log ...: Esta é a ação principal, que insere uma nova linha em nossa tabela de log.
now(): Uma função padrão que retorna o timestamp atual.
tg_event, tg_tag: Variáveis especiais disponíveis dentro de uma função de gatilho que fornecem contexto sobre o evento, como ddl_command_end e CREATE TABLE.
pg_event_trigger_ddl_commands(): Uma função que retorna um conjunto de linhas descrevendo os comandos DDL que foram executados. Usamos para obter o schema_name e objid (identificador do objeto) do objeto que está sendo criado.
Após executar o comando, você verá a seguinte confirmação:
CREATE FUNCTION
Você agora configurou com sucesso os componentes fundamentais para o seu gatilho de evento.