spi

Модуль spi предоставляет несколько рабочих примеров использования Интерфейса программирования сервера (Server Programming Interface, SPI) и триггеров. Хотя эти функции имеют некоторую ценность и сами по себе, они еще более полезны в качестве образцов, которые можно модифицировать под собственные нужды. Эти функции достаточно общие, чтобы применяться с любой таблицей, но при создании триггера следует явно указать имена таблицы и полей (как описано ниже).

Каждая описанная ниже группа функций представлена в виде отдельно устанавливаемого расширения.

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.

autoinc — функции для автоувеличения полей

Функция autoinc() является триггером, сохраняющим следующее значение последовательности в целочисленном поле. Это некоторым образом пересекается со встроенной функциональностью столбцов типа serial, но все же не одно и то же: autoinc() будет переопределять попытки вставить другое значение поля при добавлении строк, а также при необходимости может использоваться для увеличения значения поля при изменениях.

Чтобы воспользоваться этой функцией, создайте с ее помощью триггер BEFORE INSERT (или BEFORE INSERT OR UPDATE). Задайте в двух аргументах триггера имя целочисленного столбца, подлежащего изменению, и имя объекта последовательности, который будет поставлять значения. (На самом деле можно задать любое количество пар таких имен, если хотите изменять несколько автоувеличивающихся столбцов.)

Пример приведен в autoinc.example.

insert_username — функции для отслеживания пользователя, меняющего таблицу

Функция insert_username() является триггером, сохраняющим имя текущего пользователя в текстовом поле. Это может быть полезно для отслеживания пользователя, последним изменившего конкретную строку в таблице.

Чтобы воспользоваться этой функцией, создайте с ее помощью триггер BEFORE INSERT и/или UPDATE. Задайте в единственном аргументе триггера имя текстового столбца, подлежащего изменению.

Пример приведен в insert_username.example.

moddatetime — функции для отслеживания времени последнего изменения

Функция moddatetime() является триггером, сохраняющим текущее время в поле типа timestamp. Это может быть полезно для отслеживания времени последнего изменения конкретной строки в таблице.

Чтобы воспользоваться этой функцией, создайте с ее помощью триггер BEFORE UPDATE. Задайте в единственном аргументе триггера имя столбца, подлежащего изменению. Столбец должен иметь тип timestamp или timestamp with time zone.

Пример приведен в moddatetime.example.