Приходилось ли писать триггеры в базе данных?

«Приходилось ли писать триггеры в базе данных?» — вопрос из категории Базы данных, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, приходилось. Триггеры — это объекты базы данных, которые автоматически выполняют заданный код (обычно на 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).
  • Альтернативы: Для сложной бизнес-логики иногда предпочтительнее использовать хранимые процедуры как единственную точку входа для модификации данных или обрабатывать события на уровне приложения (например, через паттерн «Единый источник истины»).