Перейти к основному содержимому

Написание функций триггеров событий на C

примечание

Эта страница переведена при помощи нейросети GigaChat.

В этом разделе описаны низкоуровневые детали интерфейса для событийных триггерных функций. Эта информация необходима только при написании функций триггера событий на языке C. Если используется язык более высокого уровня, то эти подробности обрабатываются самостоятельно. В большинстве случаев следует рассмотреть возможность использования процедурного языка перед тем, как писать свои триггеры событий на языке C. Документация каждого процедурного языка объясняет, как написать триггер события на этом языке.

Триггерные функции событий должны использовать интерфейс диспетчера функций «версия 1».

Когда функция вызывается диспетчером триггеров событий, ей не передаются обычные аргументы, но передается указатель «контекст», который указывает на структуру EventTriggerData. Функции C могут проверить, были ли они вызваны диспетчером триггеров событий или нет, выполнив макрос:

CALLED_AS_EVENT_TRIGGER(fcinfo)

который разворачивается до:

((fcinfo)->context != NULL && IsA((fcinfo)->context, EventTriggerData))

Если возвращается истина, то можно безопасно привести fcinfo->context к типу EventTriggerData * и использовать указанную структуру EventTriggerData. Функция не должна изменять структуру EventTriggerData или какие-либо данные, на которые она ссылается.

struct EventTriggerData определен в commands/event_trigger.h:

typedef struct EventTriggerData
{
NodeTag type;
const char *event; /* event name */
Node *parsetree; /* parse tree */
CommandTag tag; /* command tag */
} EventTriggerData;

где члены определены следующим образом:

  • type – всегда T_EventTriggerData.
  • event – описывает событие, для которого вызывается функция, одно из "login", "ddl_command_start", "ddl_command_end", "sql_drop", "table_rewrite". Подробную информацию см. в разделе «Обзор поведения триггеров событий».
  • parsetree – указатель на дерево разбора команды. Проверьте исходный код PostgreSQL для получения подробной информации. Структура дерева разбора может быть изменена без предварительного уведомления.
  • tag – тег команды, связанный с событием, для которого выполняется триггер события, например "CREATE FUNCTION".

Функция триггера событий должна возвращать указатель NULL (но не SQL значение null, то есть не устанавливайте isNull в true).