F.60. spi — особенности/примеры использования интерфейса программирования сервера #
Модуль spi предоставляет несколько рабочих примеров использования Интерфейса программирования сервера (Server Programming Interface, SPI) и триггеров. Хотя эти функции имеют некоторую ценность сами по себе, они ещё более полезны как заготовки, которые можно приспособить под собственные нужды. Эти функции достаточно общие, чтобы работать с любой таблицей, но вы должны явно указать имена таблицы и полей (как описано ниже) при создании триггера.
Каждая группа функций, описанная ниже, представлена в виде отдельно устанавливаемого расширения.
F.60.1. refint — функции для реализации ссылочной целостности #
Функции check_primary_key()
и check_foreign_key()
применяются для проверки ограничений внешних ключей. (Эта функциональность уже давно вытеснена встроенным механизмом внешних ключей, но этот модуль всё ещё полезен в качестве примера.)
Функция check_primary_key()
проверяет ссылающуюся таблицу. Чтобы воспользоваться ей, создайте триггер BEFORE INSERT OR UPDATE
с этой функцией для таблицы, ссылающейся на другую. Укажите в аргументах триггера: имена столбцов ссылающейся таблицы, образующих внешний ключ, имя целевой таблицы и имена столбцов в ней, образующих первичный/уникальный ключ. Чтобы контролировать несколько внешних ключей, создайте триггер для каждой такой ссылки.
Функция check_foreign_key()
проверяет целевую таблицу. Чтобы использовать её, создайте триггер BEFORE DELETE OR UPDATE
с этой функцией для таблицы, на которую ссылаются другие. Укажите в аргументах триггера: число ссылающихся таблиц, для которых функция должна выполнить проверки, действие в случае обнаружения ссылающегося ключа (cascade
— удалить ссылающуюся строку, restrict
— прервать транзакцию, setnull
— установить в ссылающихся полях значения NULL), имена столбцов целевой таблицы, образующих первичный/уникальный ключ, а затем имена таблиц и столбцов (в количестве, задаваемом первым аргументом). Заметьте, что поля первичных/уникальных столбцов должны иметь пометку NOT NULL и по ним должен быть создан уникальный индекс.
Примеры приведены в refint.example
.
F.60.2. autoinc — функции для автоувеличения полей #
Функция autoinc()
реализует код триггера, сохраняющего следующее значение последовательности в целочисленном поле. Это в некоторой степени пересекается со встроенной функциональностью столбца «serial», но есть и отличия: autoinc()
препятствует попыткам вставить другое значение поля при добавлении строк и может увеличивать значение поля при изменениях.
Чтобы использовать её, создайте триггер BEFORE INSERT
(или BEFORE INSERT OR UPDATE
) с этой функцией. Передайте триггеру два аргумента: имя целочисленного столбца, который будет меняться, и имя объекта последовательности, который будет поставлять значения. (Вообще вы можете задать любое число пар таких имён, если хотите поддерживать несколько автоувеличивающихся столбцов.)
Пример приведён в autoinc.example
.
F.60.3. insert_username — функции для отслеживания пользователя, вносящего изменения #
Функция insert_username()
реализует код триггера, сохраняющего имя текущего пользователя в текстовом поле. Это может быть полезно для отслеживания пользователя, изменившего конкретную строку таблицы последним.
Чтобы использовать её, создайте триггер BEFORE INSERT
и/или UPDATE
с этой функцией. Передайте триггеру один аргумент: имя целевого текстового столбца.
Пример приведён в insert_username.example
.
F.60.4. moddatetime — функции для отслеживания времени последнего изменения #
Функция moddatetime()
реализует код триггера, сохраняющего текущее время в поле типа timestamp
. Это может быть полезно для отслеживания времени последней модификации конкретной строки таблицы.
Чтобы использовать её, создайте триггер BEFORE UPDATE
с этой функцией. Передайте триггеру один аргумент: имя целевого столбца. Столбец должен иметь тип timestamp
или timestamp with time zone
.
Пример приведён в moddatetime.example
.