Личный кабинет
Укажите e-mail, на который будет выслан код восстановления пароля.
На указанный вами адрес e-mail был выслан код подтверждения аккаунта. Введите полученный код для продолжения:
Введите новый пароль два раза:
Этот раздел описывает низкоуровневые детали интерфейса для триггерной функции. Эта информация необходима только при разработке триггерных функций на C. При использовании языка более высокого уровня эти детали обрабатываются автоматически. В большинстве случаев необходимо рассмотреть использование процедурного языка, прежде чем начать разрабатывать триггеры на C. В документации по каждому процедурному языку объясняется как создавать триггеры на этом языке.
Триггерные функции должны использовать интерфейс функций «версии 1».
Когда функция вызывается диспетчером триггеров, ей не передаются обычные аргументы, но передаётся указатель «context», ссылающийся на структуру TriggerData. Функции на C могут проверить, вызваны ли они диспетчером триггеров или нет, выполнив макрос:
TriggerData
CALLED_AS_TRIGGER(fcinfo)
который разворачивается в:
((fcinfo)->context != NULL && IsA((fcinfo)->context, TriggerData))
Если возвращается истина, то fcinfo->context можно безопасно привести к типу TriggerData * и использовать указатель на структуру TriggerData. Функция не должна изменять структуру TriggerData или любые данные, которые на неё указывают.
fcinfo->context
TriggerData *
struct TriggerData определяется в commands/trigger.h:
struct TriggerData
commands/trigger.h
typedef struct TriggerData { NodeTag type; TriggerEvent tg_event; Relation tg_relation; HeapTuple tg_trigtuple; HeapTuple tg_newtuple; Trigger *tg_trigger; Buffer tg_trigtuplebuf; Buffer tg_newtuplebuf; } TriggerData;
где элементы определяются следующим образом:
type
Всегда T_TriggerData.
T_TriggerData
tg_event
Описывает событие, для которого вызывается функция. Можно использовать следующие макросы для получения информации о tg_event:
TRIGGER_FIRED_BEFORE(tg_event)
Возвращает истину, если триггер сработал до операции.
TRIGGER_FIRED_AFTER(tg_event)
Возвращает истину, если триггер сработал после операции.
TRIGGER_FIRED_INSTEAD(tg_event)
Возвращает истину, если триггер сработал вместо операции.
TRIGGER_FIRED_FOR_ROW(tg_event)
Возвращает истину, если триггер сработал на уровне строки.
TRIGGER_FIRED_FOR_STATEMENT(tg_event)
Возвращает истину, если триггер сработал на уровне оператора.
TRIGGER_FIRED_BY_INSERT(tg_event)
Возвращает истину, если триггер сработал для операции INSERT.
INSERT
TRIGGER_FIRED_BY_UPDATE(tg_event)
Возвращает истину, если триггер сработал для операции UPDATE.
UPDATE
TRIGGER_FIRED_BY_DELETE(tg_event)
Возвращает истину, если триггер сработал для операции DELETE.
DELETE
TRIGGER_FIRED_BY_TRUNCATE(tg_event)
Возвращает истину, если триггер сработал для операции TRUNCATE.
TRUNCATE
tg_relation
Указатель на структуру, описывающую таблицу, для которой сработал триггер. Подробнее об этой структуре в utils/rel.h. Самое интересное здесь это tg_relation->rd_att (дескриптор записей таблицы) и tg_relation->rd_rel->relname (имя таблицы; имеет тип NameData, а не char*; используйте SPI_getrelname(tg_relation), чтобы получить тип char* если потребуется копия имени).
utils/rel.h
tg_relation->rd_att
tg_relation->rd_rel->relname
NameData
char*
SPI_getrelname(tg_relation)
tg_trigtuple
Указатель на строку, для которой сработал триггер. Это строка, которая вставляется, обновляется или удаляется. При срабатывании триггера для INSERT или DELETE это значение нужно вернуть из функции, только если не планируется изменять строку (в случае INSERT) или пропускать операцию для этой строки.
tg_newtuple
Для триггера на UPDATE это указатель на новую версию строки либо NULL, если триггер на INSERT или DELETE. Это значение нужно вернуть из функции в случае UPDATE, если не планируется изменять строку или пропускать операцию для этой строки.
NULL
tg_trigger
Указатель на структуру с типом Trigger, определённую в utils/reltrigger.h:
Trigger
utils/reltrigger.h
typedef struct Trigger { Oid tgoid; char *tgname; Oid tgfoid; int16 tgtype; char tgenabled; bool tgisinternal; Oid tgconstrrelid; Oid tgconstrindid; Oid tgconstraint; bool tgdeferrable; bool tginitdeferred; int16 tgnargs; int16 tgnattr; int16 *tgattr; char **tgargs; char *tgqual; } Trigger;
где tgname — имя триггера, tgnargs — количество аргументов в tgargs, и tgargs — массив указателей на аргументы, указанные в команде CREATE TRIGGER. Остальные члены структуры предназначены для внутреннего использования.
tgname
tgnargs
tgargs
CREATE TRIGGER
tg_trigtuplebuf
Буфер, содержащий tg_trigtuple, или содержащий InvalidBuffer — если нет такой строки или она не хранится в дисковом буфере.
InvalidBuffer
tg_newtuplebuf
Буфер, содержащий tg_newtuple, или содержащий InvalidBuffer — если нет такой строки или она не хранится в дисковом буфере.
Триггерная функция должна возвращать указатель HeapTuple или указатель NULL (но не SQL значение null, то есть не нужно устанавливать isNull в истину). Не забудьте, что если не планируете менять обрабатываемую триггером строку, то нужно вернуть либо tg_trigtuple, либо tg_newtuple.
HeapTuple
null
isNull
Соглашаюсь с условиями обработки персональных данных