Для чего нужен триггер в контексте баз данных?

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

Ответ

Триггер (Trigger) — это специальная хранимая процедура в СУБД, которая автоматически выполняется (срабатывает) при наступлении определенного события с таблицей: INSERT, UPDATE или DELETE. Триггеры привязаны к таблице и позволяют реализовать сложную бизнес-логику и поддержание целостности данных непосредственно на уровне БД.

Типичные сценарии использования:

  1. Аудит и логирование изменений:

    CREATE TRIGGER audit_employee_update
    AFTER UPDATE ON Employees
    FOR EACH ROW
    BEGIN
        INSERT INTO AuditLog (table_name, record_id, action, old_value, new_value, changed_at, changed_by)
        VALUES ('Employees', OLD.id, 'UPDATE', OLD.salary, NEW.salary, CURRENT_TIMESTAMP, USER());
    END;

    Здесь OLD и NEW — псевдонимы для строк до и после изменения.

  2. Поддержание денормализованных данных или вычисляемых полей:

    CREATE TRIGGER update_order_total
    AFTER INSERT ON OrderItems
    FOR EACH ROW
    BEGIN
        UPDATE Orders
        SET total_amount = (
            SELECT SUM(quantity * price) FROM OrderItems WHERE order_id = NEW.order_id
        )
        WHERE id = NEW.order_id;
    END;
  3. Сложная валидация, которую нельзя выразить через CHECK:

    CREATE TRIGGER validate_salary
    BEFORE INSERT ON Employees
    FOR EACH ROW
    BEGIN
        IF (NEW.salary > (SELECT avg_salary * 2 FROM Department WHERE id = NEW.department_id)) THEN
            SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Salary exceeds department limit';
        END IF;
    END;

Важные особенности и недостатки:

  • Прозрачность: Логика в триггерах скрыта от прикладного кода, что может усложнить отладку.
  • Производительность: Каждая операция с таблицей несет дополнительную нагрузку от выполнения триггера.
  • Каскадное срабатывание: Триггер может модифицировать другую таблицу, в которой тоже есть триггер, что может привести к цепочке вызовов.
  • Порядок: В некоторых СУБД можно задавать порядок выполнения нескольких триггеров на одно событие.

Итог: Триггеры — мощный, но требующий осторожного применения инструмент для реализации логики, критичной к целостности данных, непосредственно в БД.