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
.