Gymterview
middle

Что такое триггер?

Триггер (trigger) — хранимая процедура особого типа, которая автоматически выполняется сервером БД при определённом событии модификации данных (INSERT, UPDATE, DELETE) в заданной таблице. Пользователь не вызывает триггер явно — он срабатывает как реакция на событие.

Моменты срабатывания

Момент Ключевое слово Поведение
До события BEFORE Может изменить вставляемые/обновляемые данные или отменить операцию
После события AFTER Выполняется после записи изменений, может выполнять сопутствующую логику
Вместо события INSTEAD OF Заменяет событие (используется для обновляемых представлений)

Уровни срабатывания

  • FOR EACH ROW — триггер вызывается для каждой затронутой строки
  • FOR EACH STATEMENT — триггер вызывается один раз для всего оператора (независимо от количества строк)

Применение

  • Обеспечение целостности данных и реализация сложной бизнес-логики
  • Аудит изменений (автоматическая запись в таблицу истории)
  • Каскадные обновления связанных данных
  • Валидация данных, которую нельзя выразить через CHECK

Все изменения, произведённые триггером, выполняются в той же транзакции, что и вызвавшее его событие. При обнаружении ошибки или нарушении целостности данных вся транзакция может быть откачена.

Пример триггера для аудита
CREATE OR REPLACE FUNCTION log_salary_changes()
RETURNS TRIGGER AS $$
BEGIN
    INSERT INTO salary_audit (employee_id, old_salary, new_salary, changed_at)
    VALUES (OLD.id, OLD.salary, NEW.salary, NOW());
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trg_salary_audit
AFTER UPDATE OF salary ON employees
FOR EACH ROW
WHEN (OLD.salary IS DISTINCT FROM NEW.salary)
EXECUTE FUNCTION log_salary_changes();

На собеседовании: объясните, что триггер — это автоматическая реакция на DML-событие, упомяните BEFORE/AFTER и уровни ROW/STATEMENT. Частая ошибка — не знать, что триггер выполняется в той же транзакции и может её откатить.