Crear una Tabla de Registro y una Función de Disparador
En este paso, creará los objetos de base de datos necesarios para registrar eventos DDL: una tabla para almacenar los registros y una función que ejecutará el disparador.
Primero, abra una terminal y conéctese a la base de datos PostgreSQL utilizando el shell interactivo psql. Realizará las operaciones SQL subsiguientes dentro de este shell.
sudo -u postgres psql
Ahora debería ver el prompt de PostgreSQL, que se parece a postgres=#.
A continuación, cree una tabla llamada event_log para almacenar los detalles de cada evento DDL. Esta tabla tendrá columnas para la hora del evento, el tipo, el esquema, el nombre del objeto y el comando que se ejecutó.
Ejecute el siguiente comando SQL en el shell psql:
CREATE TABLE event_log (
event_time timestamp with time zone,
event_type text,
schema_name text,
object_name text,
command_tag text
);
Tras una ejecución exitosa, PostgreSQL responderá con:
CREATE TABLE
Ahora, cree la función que será disparada por el evento DDL. Esta función, log_ddl_event, insertará un nuevo registro en la tabla 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;
Analicemos esta función:
RETURNS event_trigger: Especifica que este es un tipo especial de función diseñada para ser utilizada con disparadores de eventos.
AS $$ ... $$ LANGUAGE plpgsql: Define el cuerpo de la función utilizando el lenguaje procedural plpgsql.
INSERT INTO event_log ...: Esta es la acción principal, que inserta una nueva fila en nuestra tabla de registro.
now(): Una función estándar que devuelve la marca de tiempo actual.
tg_event, tg_tag: Variables especiales disponibles dentro de una función de disparador que proporcionan contexto sobre el evento, como ddl_command_end y CREATE TABLE.
pg_event_trigger_ddl_commands(): Una función que devuelve un conjunto de filas que describen los comandos DDL que se ejecutaron. La utilizamos para obtener el schema_name y objid (identificador de objeto) del objeto que se está creando.
Después de ejecutar el comando, verá la siguiente confirmación:
CREATE FUNCTION
Ahora ha configurado con éxito los componentes fundamentales para su disparador de eventos.