Хотя во многих случаях используются триггерные функции, написанные пользователем, Digital Q.DataBase предоставляет несколько встроенных триггерных функций, которые можно использовать непосредственно в пользовательских триггерах. Они кратко описаны в Таблица 2.6.107. (Существуют также дополнительные встроенные триггерные функции, реализующие ограничения внешнего ключа и отложенные ограничения индекса. Они здесь не рассматриваются, так как пользователям не нужно вызывать их напрямую.)
Дополнительные сведения о создании триггеров приведены в CREATE TRIGGER.
Таблица 2.6.107. Встроенные триггерные функции
Функция Описание Пример использования |
|---|
Подавляет избыточные операции обновления (do-nothing). Подробности приведены ниже.
|
Автоматически обновляет
|
Автоматически обновляет
|
Метод 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» префикс в данном примере).