Создание таблицы журналов и функции триггера
На этом шаге вы создадите необходимые объекты базы данных для ведения журнала событий DDL: таблицу для хранения журналов и функцию, которую будет выполнять триггер.
Сначала откройте терминал и подключитесь к базе данных PostgreSQL с помощью интерактивной оболочки psql. Последующие операции SQL вы будете выполнять в этой оболочке.
sudo -u postgres psql
Теперь вы должны увидеть приглашение PostgreSQL, которое выглядит как postgres=#.
Далее создайте таблицу с именем event_log для хранения деталей каждого события DDL. Эта таблица будет иметь столбцы для времени события, типа, схемы, имени объекта и выполненной команды.
Выполните следующую команду SQL в оболочке psql:
CREATE TABLE event_log (
event_time timestamp with time zone,
event_type text,
schema_name text,
object_name text,
command_tag text
);
После успешного выполнения PostgreSQL ответит:
CREATE TABLE
Теперь создайте функцию, которая будет вызываться событием DDL. Эта функция, log_ddl_event, будет вставлять новую запись в таблицу 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;
Разберем эту функцию:
RETURNS event_trigger: Указывает, что это специальный тип функции, предназначенный для использования с триггерами событий.
AS $$ ... $$ LANGUAGE plpgsql: Определяет тело функции с использованием процедурного языка plpgsql.
INSERT INTO event_log ...: Это основное действие, которое вставляет новую строку в нашу таблицу журналов.
now(): Стандартная функция, возвращающая текущую временную метку.
tg_event, tg_tag: Специальные переменные, доступные внутри триггерной функции, которые предоставляют контекст о событии, например ddl_command_end и CREATE TABLE.
pg_event_trigger_ddl_commands(): Функция, которая возвращает набор строк, описывающих выполненные команды DDL. Мы используем ее для получения schema_name и objid (идентификатор объекта) создаваемого объекта.
После выполнения команды вы увидите следующее подтверждение:
CREATE FUNCTION
Теперь вы успешно настроили основные компоненты для вашего триггера событий.