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

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

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

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

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

F.11.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), имена столбцов таблицы, на которой срабатывает триггер, которые образуют первичный/уникальный ключ, а затем имя 5679ш таблицы и столбцов (повторяется для каждой ссылающейся таблицы, указанной в первом аргументе). Обратите внимание, что столбцы первичного/уникального ключа должны быть отмечены как NOT NULL и должны иметь уникальный индекс.

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

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

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

Для использования создайте триггер 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.