F.11. spi — возможности/примеры интерфейса программирования сервера#

F.11. spi — возможности/примеры интерфейса программирования сервера

F.11. spi — возможности/примеры интерфейса программирования сервера #

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

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

F.11.1. refint — Функции для реализации ссылочной целостности #

check_primary_key() и check_foreign_key() используются для проверки ограничений внешнего ключа. (Конечно, эта функциональность давно заменена встроенным механизмом внешнего ключа, но модуль все еще полезен как пример).

check_primary_key() проверяет ссылающуюся таблицу. Чтобы воспользоваться, необходимо создать триггер AFTER INSERT OR UPDATE с этой функцией на таблице, ссылающейся на другую таблицу. В качестве аргументов триггера укажите: имя(имена) столбца (столбцов) ссылающейся таблицы, которые образуют внешний ключ, имя целевой таблицы и имена столбцов в целевой таблице, которые образуют первичный/уникальный ключ. Для контроля нескольких внешних ключей создайте отдельный триггер для каждой ссылки.

check_foreign_key() проверяет целевую таблицу. Чтобы воспользоваться, необходимо создать AFTER DELETE OR UPDATE с этой функцией на таблице, на которую ссылаются другие таблицы. В качестве аргументов триггера укажите: количество ссылающихся таблиц, для которых функция должна выполнить проверку, действие при обнаружении ссылающегося ключа (cascade — удалить ссылающуюся строку, restrict — прервать транзакцию, если существуют ссылающиеся ключи, setnull — установить поля ссылающегося ключа в null), имена столбцов таблицы, образующих первичный/уникальный ключ, затем имя ссылающейся таблицы и имена столбцов (количество задается первым аргументом). Обратите внимание, что столбцы первичного/уникального ключа должны быть помечены как NOT NULL и должны иметь уникальный индекс.

Обратите внимание, что если эти триггеры выполняются от другого триггера BEFORE, и они могут завершиться с неожиданной ошибкой. Например, если пользователь вставляет row1, а затем триггер BEFORE вставляет row2 и вызывает триггер с вызовом check_foreign_key(), функция check_foreign_key() не увидит row1 и завершится с ошибкой.

В документации PostgreSQL есть примеры в файле refint.example.

F.11.2. autoinc — Функции для автоинкрементных полей #

autoinc() — это триггер, который сохраняет следующее значение последовательности в целочисленном поле. Это частично пересекается с встроенной функцией столбца “serial column”, но не является полным аналогом. Триггер заменяет значение поля только в том случае, если оно изначально равно нулю или null (после выполнения SQL-оператора, вставившего или обновившего строку). Кроме того, если следующее значение последовательности равно нулю, функция nextval() вызывается второй раз для получения ненулевого значения.

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

В документации PostgreSQL есть пример в файле autoinc.example.

F.11.3. insert_username — Функции для отслеживания, кто изменил таблицу #

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

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

В документации PostgreSQL есть пример в файле insert_username.example.

F.11.4. moddatetime — Функции для отслеживания времени последнего изменения #

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

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

В документации PostgreSQL есть пример в файле moddatetime.example.