Введение
Концепция управляющего поля в PostgreSQL для контроля поведения триггеров при каскадных или перекрёстных обновлениях данных.
Задачи управляющего поля
Назовём поле _trigger_off. Его основные функции:
- Определить, следует ли исполнять основной код триггерной функции.
- Понять, откуда поступил запрос: из приложения или из соседнего триггера.
Поле имеет тип BOOLEAN (с учётом NULL получается 4 варианта: TRUE, FALSE, NULL, NOT NULL).
Правила управляющего поля
1. Поле в таблице ВСЕГДА сохраняется NULL
Создаётся общая функция для сброса значения:
CREATE FUNCTION "public"."flush_trigger_off" ()
RETURNS TRIGGER AS
$body$
BEGIN
NEW._trigger_off := NULL;
RETURN NEW;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE; И триггер для её использования:
CREATE TRIGGER flush_control_field
BEFORE INSERT OR UPDATE
ON [table_name] FOR EACH ROW
EXECUTE PROCEDURE "public"."flush_trigger_off"(); 2. Поле НЕ должно использоваться внешним приложением
Это внутреннее поле БД. Исключение — восстановление целостности данных при необходимости.
3. Поле должно ВСЕГДА использоваться во внутренних запросах
При вызове из хранимых процедур поле помогает контролировать каскадные обновления.
Заключение
Управляющее поле позволяет контролировать точки входа запросов и принимать соответствующие решения на уровне триггеров.