Как получить текст SQL из триггера события Postgres

В событии события pgsql на теге ALTER TABLE, я хочу знать, какая таблица изменяется.

Переменные pg не охватывают это, и переменные, открытые GET STACKED DIAGNOSTICS.

Имея доступные переменные, есть ли какой-либо путь внутри самой функции триггера, чтобы увидеть текст команды SQL, ответственный за запуск функции.

например, если

ALTER TABLE base1 ADD COLUMN col1 int;

отвечали за вызов триггера события, есть ли какой-либо способ внутри триггера события увидеть сам текст ALTER TABLE base1 ADD COLUMN col1 int?

Ответы

Ответ 1

Начиная с PostgreSQL 9.5, функция pg_event_trigger_ddl_commands() доступна для ddl_command_end триггеров событий. Используя фильтр TAG, он может использоваться для обработки любой таблицы ALTERed. object_identity (или objid) может использоваться для решения исходной проблемы определения того, какая таблица была изменена. Что касается получения полной команды, она также доступна, но она имеет внутренний тип pg_ddl_command.

CREATE TABLE t (n INT);

CREATE FUNCTION notice_event() RETURNS event_trigger AS $$
DECLARE r RECORD;
BEGIN
    FOR r IN SELECT * FROM pg_event_trigger_ddl_commands() LOOP
        RAISE NOTICE 'caught % event on %', r.command_tag, r.object_identity;
    END LOOP;
END;
$$
LANGUAGE plpgsql;

CREATE EVENT TRIGGER tr_notice_alter_table
  ON ddl_command_end WHEN TAG IN ('ALTER TABLE')
  EXECUTE PROCEDURE notice_event();

ALTER TABLE t ADD c CHAR;

выходы: NOTICE: caught ALTER TABLE event on public.t

Ответ 2

Есть ли примеры где-нибудь для анализа pg_ddl_command. Я видел комментарии об использовании внешней функции C для ее синтаксического анализа, но где я могу найти образец этого или определение формата команды pg_ddl_command.

Файл журнала явно ссылается на полную команду ALTER, как мне получить aceess или воссоздать эту команду Alter???