В данном разделе представлены низкоуровневые сведения об интерфейсе функции событийного триггера. Данная информация необходима только при написании функций событийных триггеров на языке C. При использовании языков более высокого уровня эти детали обрабатываются автоматически. В большинстве случаев перед написанием событийных триггеров на языке C следует рассмотреть возможность использования процедурных языков. В документации к каждому процедурному языку объясняется порядок написания событийного триггера на соответствующем языке.
В функциях событийных триггеров должен использоваться «интерфейс менеджера функций» интерфейс менеджера функций.
При вызове функции менеджером событийных триггеров ей не передаются обычные аргументы; вместо этого передается «контекстный» указатель,
ссылающийся на 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; /* имя события */
Node *parsetree; /* дерево разбора */
CommandTag tag; /* тег команды */
} EventTriggerData;
где элементы структуры определены следующим образом:
тип
Всегда T_EventTriggerData.
событие
Описывает событие, для которого вызывается функция; одно из следующих:
"login", "ddl_command_start",
"ddl_command_end", "sql_drop",
"table_rewrite".
См. Раздел 5.3.1 для получения информации о значении этих
событий.
parsetreeУказатель на дерево разбора команды. Для получения подробных сведений следует обратиться к исходному коду PostgreSQL. Структура дерева разбора может быть изменена без предварительного уведомления.
tag
Тег команды, связанный с событием, для которого запускается
событийный триггер, например, "CREATE FUNCTION".
Функция событийного триггера должна возвращать NULL указатель
(не не значение SQL null, то есть параметр isNull true).