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

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

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

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

Функции триггеров событий должны использовать интерфейс менеджера функций версии 1.

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

CALLED_AS_EVENT_TRIGGER(fcinfo)

который расширяется в:

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

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

Структура 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

Always T_EventTriggerData.

event

Описывает событие, для которого вызывается функция, одно из "ddl_command_start", "ddl_command_end", "sql_drop", "table_rewrite". См. Раздел 38.1 для значения этих событий.

parsetree

Указатель на дерево разбора команды. Подробности можно найти в исходном коде PostgreSQL. Структура дерева разбора может изменяться без предупреждения.

tag

Тег команды, связанный с событием, для которого выполняется триггер событий, например "CREATE FUNCTION".

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