37.3. Написание функций триггеров событий на C#
37.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"
. См. Раздел 37.1 для значения этих событий.parsetree
Указатель на дерево разбора команды. Подробности можно найти в исходном коде PostgreSQL. Структура дерева разбора может изменяться без предупреждения.
tag
Тег команды, связанный с событием, для которого выполняется триггер событий, например
"CREATE FUNCTION"
.
Триггерная функция события должна возвращать указатель NULL
(а не значение SQL NULL, то есть, не устанавливайте
параметр isNull
в значение true).