Хранимые процедуры, функции и триггеры

Обзорно знакомимся с логикой, которая живёт внутри самой базы: процедуры, функции и триггеры.

Хранимая процедура — это набор SQL-команд, сохранённый в базе под именем и вызываемый одной командой CALL.

Хранимые процедуры

Процедура инкапсулирует последовательность действий на стороне сервера. Внутри можно использовать переменные, условия, циклы. Чтобы тело процедуры с точками с запятой не «разорвалось», временно меняют разделитель командой DELIMITER.

DELIMITER //

CREATE PROCEDURE add_bonus(IN user_id INT, IN amount INT)
BEGIN
  UPDATE accounts SET balance = balance + amount WHERE id = user_id;
END //

DELIMITER ;

CALL add_bonus(1, 500);   -- вызвать процедуру

Хранимые функции

Функция похожа на процедуру, но возвращает значение и вызывается прямо внутри запроса, как встроенные функции.

CREATE FUNCTION full_price(price DECIMAL(10,2), tax DECIMAL(4,2))
RETURNS DECIMAL(10,2)
DETERMINISTIC
RETURN price * (1 + tax);

SELECT name, full_price(price, 0.20) AS with_tax FROM products;

Триггеры

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

CREATE TRIGGER log_price_change
AFTER UPDATE ON products
FOR EACH ROW
INSERT INTO price_log (product_id, old_price, new_price)
VALUES (OLD.id, OLD.price, NEW.price);

Внутри триггера OLD — значения до изменения, NEW — после. Срабатывает он на каждую затронутую строку.

Когда это уместно, а когда нет

ЗаПротив
логика рядом с данными, меньше трафикатруднее версионировать и тестировать, чем код приложения
единые правила для всех клиентовскрытая логика: триггеры срабатывают «невидимо»
атомарность сложных операцийсложнее отлаживать и переносить между СУБД

Современный подход: бизнес-логику чаще держат в приложении (её легче тестировать и версионировать), а в базе оставляют то, что обязано быть рядом с данными — целостность, аудит, тяжёлые пакетные операции.

Почему здесь нет живого примера

Процедуры, функции и триггеры — это процедурный диалект MySQL (BEGIN…END, DELIMITER, CALL), которого нет в учебной SQLite-песочнице. Поэтому все примеры выше — для чтения, помечены как текст.

Итог

  • Процедура — именованный набор команд, вызывается через CALL.
  • Функция возвращает значение и используется прямо в запросе.
  • Триггер срабатывает автоматически на INSERT/UPDATE/DELETE; OLD/NEW дают старые и новые значения.
  • Бизнес-логику чаще держат в приложении; в базе оставляют целостность и аудит.
Проверьте себя
1. Чем хранимая функция отличается от процедуры?
Aфункция не сохраняется в базе
Bфункция возвращает значение и вызывается внутри запроса
Cпроцедура работает быстрее всегда
Dмежду ними нет различий
2. Когда срабатывает триггер?
Aпри подключении пользователя
Bавтоматически при INSERT/UPDATE/DELETE в таблице
Cтолько вручную через CALL
Dраз в сутки по расписанию
3. Что обозначают OLD и NEW внутри триггера?
Aимена двух таблиц
Bзначения строки до и после изменения
Cстарую и новую версию MySQL
Dиндексы
Поддержать проект