Ответ
Да, приходилось. Триггеры — это объекты базы данных, которые автоматически выполняют заданный код (обычно на SQL или PL/pgSQL) в ответ на определённое событие (INSERT, UPDATE, DELETE) в связанной таблице.
Типичный пример использования — аудит изменений:
-- Триггер для логирования изменения цены товара в PostgreSQL
CREATE OR REPLACE FUNCTION log_price_change()
RETURNS TRIGGER AS $$
BEGIN
IF OLD.price <> NEW.price THEN
INSERT INTO product_audit_log (
product_id,
old_price,
new_price,
changed_at,
changed_by
) VALUES (
NEW.id,
OLD.price,
NEW.price,
NOW(),
CURRENT_USER
);
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER tr_product_price_audit
AFTER UPDATE ON products
FOR EACH ROW
EXECUTE FUNCTION log_price_change();
Ключевые моменты и best practices:
- Транзакционность: Триггер выполняется в контексте той же транзакции, что и вызвавшее его событие. Ошибка в триггере приведёт к откату всей операции.
- Производительность: Триггеры добавляют накладные расходы на каждую операцию. Слишком сложная логика или триггеры на часто изменяемых таблицах могут стать узким местом.
- Сложность отладки: Поскольку выполнение неявное, поиск причины неожиданного поведения данных может усложниться.
- Рекурсия: Необходимо контролировать, чтобы действия триггера не вызывали его повторное срабатывание (прямая или косвенная рекурсия). В некоторых СУБД есть настройки (
RECURSIVE_TRIGGERS). - Альтернативы: Для сложной бизнес-логики иногда предпочтительнее использовать хранимые процедуры как единственную точку входа для модификации данных или обрабатывать события на уровне приложения (например, через паттерн «Единый источник истины»).