9.28. Функции триггеров#

9.28. Функции триггеров

9.28. Функции триггеров #

В то время как многие применения триггеров включают пользовательские функции триггеров, Tantor SE-1C предоставляет несколько встроенных триггерных функций, которые могут быть использованы напрямую в определении пользовательских триггеров. Эти функции кратко описаны в Таблица 9.103. (Существуют также дополнительные встроенные функции триггеров, которые реализуют ограничения внешнего ключа и отложенные ограничения индекса. Они не документированы здесь, так как пользователи не обязаны использовать их напрямую).

Для получения дополнительной информации о создании триггеров см. CREATE TRIGGER.

Таблица 9.103. Встроенные функции триггеров

Функция

Описание

Пример использования

suppress_redundant_updates_trigger ( ) → trigger

Подавляет операции обновления, которые ничего не делают. Подробности см. ниже.

CREATE TRIGGER ... suppress_redundant_updates_trigger()

tsvector_update_trigger ( ) → trigger

Автоматически обновляет столбец tsvector из связанного столбца(-ов) с обычным текстом. Конфигурация полнотекстового поиска, которую следует использовать, указывается по имени в качестве аргумента триггера. См. Раздел 12.4.3 для получения подробной информации.

CREATE TRIGGER ... tsvector_update_trigger(tsvcol, 'pg_catalog.swedish', title, body)

tsvector_update_trigger_column ( ) → trigger

Автоматически обновляет столбец tsvector из связанного столбца(-ов) с обычным текстом. Конфигурация поиска текста берется из столбца regconfig таблицы. Подробности см. в разделе Раздел 12.4.3.

CREATE TRIGGER ... tsvector_update_trigger_column(tsvcol, tsconfigcol, title, body)


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

В идеале, следует избегать выполнения обновлений, которые фактически не изменяют данные в записи. Избыточные обновления могут занимать значительное время, особенно если требуется изменить много индексов, и занимать место в мертвых строках, которые в конечном итоге придется очистить. Однако обнаружение таких ситуаций в клиентском коде не всегда просто или даже возможно, а написание выражений для их обнаружения может быть подвержено ошибкам. Альтернативой является использование функции suppress_redundant_updates_trigger, которая пропускает обновления, не изменяющие данные. Однако следует использовать ее осторожно. Триггеру требуется какое-то время для каждой записи, поэтому, если большинство записей, затронутых обновлениями, действительно изменяются, использование этого триггера сделает обновления в среднем медленнее.

Функцию suppress_redundant_updates_trigger можно добавить к таблице следующим образом:

CREATE TRIGGER z_min_update
BEFORE UPDATE ON tablename
FOR EACH ROW EXECUTE FUNCTION suppress_redundant_updates_trigger();

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