Ответ
Триггер (Trigger) — это специальный хранимый блок кода в СУБД, который автоматически выполняется при наступлении определённого события с таблицей: INSERT, UPDATE или DELETE. Триггер может срабатывать BEFORE (до) или AFTER (после) операции.
Основное назначение:
- Обеспечение целостности данных и сложных бизнес-правил.
- Ведение журнала аудита (логирования изменений).
- Каскадные обновления или вычисления производных данных.
Пример триггера для аудита в PostgreSQL:
CREATE TRIGGER audit_employee_update
AFTER UPDATE ON employees
FOR EACH ROW
EXECUTE FUNCTION log_employee_change();
-- Связанная функция
CREATE OR REPLACE FUNCTION log_employee_change()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO employee_audit (
employee_id,
changed_at,
old_salary,
new_salary
) VALUES (
OLD.id,
NOW(),
OLD.salary,
NEW.salary
);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
Важные аспекты:
- Производительность: Триггеры добавляют накладные расходы на каждую операцию DML.
- Отладка: Их выполнение неявно, что может усложнить поиск ошибок.
- Рекурсия: Необходимо избегать ситуаций, когда триггер вызывает операцию, вновь запускающую этот же триггер.
Ответ 18+ 🔞
А, триггеры, ёпта! Ну это ж такая штука, которая в базе данных сидит, как хитрая жопа, и ждёт своего часа. Представь себе сторожа-невидимку, который автоматически, блядь, впендюривается в твою операцию с таблицей — INSERT, UPDATE или DELETE. И делает это либо до, либо после неё. Сам, сука! Без твоего ведома!
Зачем это, спрашивается, надо?
- Чтобы целостность данных соблюсти, когда бизнес-правила такие, что просто
PRIMARY KEYне хватит, овердохуища логики. - Чтобы журнал аудита вести — кто, когда и что поменял. Чтоб потом, если что, было к кому претензии предъявить.
- Чтобы какие-нибудь каскадные обновления или пересчёты делать.
Вот смотри, как это выглядит в жизни, на примере Постгреса. Допустим, зарплату сотруднику поменяли, а нам надо это в историю записать:
CREATE TRIGGER audit_employee_update
AFTER UPDATE ON employees
FOR EACH ROW
EXECUTE FUNCTION log_employee_change();
-- А это сама функция, которую триггер дергает
CREATE OR REPLACE FUNCTION log_employee_change()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO employee_audit (
employee_id,
changed_at,
old_salary,
new_salary
) VALUES (
OLD.id, -- Старая запись, блядь!
NOW(),
OLD.salary,
NEW.salary -- А это новая, ебать!
);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
Но тут, чувак, есть подводные, блядь, камни, о которые можно все зубы сломать:
- Производительность: Каждый раз, когда ты что-то делаешь с таблицей, этот невидимый сторож тоже работу делает. Надо десять тысяч строк обновить? Он десять тысяч раз и выстрелит. Представляешь накладные расходы?
- Отладка: Ошибка в триггере — это просто пиздец. Потому что выполняется он неявно. Ты
UPDATEсделал, а тебе ошибку какую-то непонятную. А это, оказывается, триггер где-то в глубине системы сломался. Волнение ебать! - Рекурсия: Вот это вообще, в рот меня чих-пых! Можешь так накрутить, что триггер вызовет операцию, которая снова вызовет этот же триггер. И пошло-поехало, пока сервер не накроется медным тазом. Терпения ноль ебать у админов будет!
Короче, инструмент мощный, но как топор в руках обезьяны. Сначала думай, э бошка, потом уже триггеры плоди.