Написание функций триггеров событий на 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
).