Модуль spi модуль предоставляет несколько практических примеров использования Server Programming Interface (SPI) и триггеров. Хотя эти функции представляют определенную ценность сами по себе, они еще более полезны в качестве примеров, которые можно адаптировать для собственных целей. Функции достаточно универсальны для работы с любой таблицей, однако при создании триггера необходимо указать имена таблиц и полей (как описано ниже).
Каждая из описанных ниже групп функций поставляется в виде отдельно устанавливаемого расширения.
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.
autoinc() — это триггер, сохраняющий следующее значение последовательности в целочисленное поле. Этот функционал частично пересекается со встроенной возможностью «столбцов serial» функциональностью, однако они не идентичны:
autoinc() будет переопределять попытки подстановки иного значения поля при операциях вставки, а также, опционально, может применяться для инкремента поля при обновлениях.
Для использования создайте BEFORE INSERT (или, при необходимости, BEFORE
INSERT OR UPDATE) триггер, использующий данную функцию. Укажите два аргумента триггера: имя модифицируемого целочисленного столбца и имя объекта последовательности, генерирующего значения. (Допускается указывать любое количество пар таких имен, если требуется обновлять несколько автоинкрементных столбцов).
Пример приведен в autoinc.example.
insert_username() — это триггер, сохраняющий имя текущего пользователя в текстовое поле. Это может быть полезно для отслеживания того, кто последним изменил конкретную строку в таблице.
Для использования создайте BEFORE INSERT и/или UPDATE
триггер, использующий данную функцию. Укажите один аргумент триггера: имя изменяемого текстового столбца.
Пример приведен в insert_username.example.
moddatetime() — это триггер, сохраняющий текущее время в timestamp поле. Это может быть полезно для отслеживания времени последнего изменения конкретной строки в таблице.
Для использования создайте BEFORE UPDATE
триггер, использующий данную функцию. Укажите единственный аргумент триггера:
имя изменяемого столбца.
Столбец должен иметь тип timestamp или timestamp with
time zone.
Пример приведен в moddatetime.example.