Хранимые процедуры, функции и триггеры
Обзорно знакомимся с логикой, которая живёт внутри самой базы: процедуры, функции и триггеры.
Хранимая процедура — это набор 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дают старые и новые значения. - Бизнес-логику чаще держат в приложении; в базе оставляют целостность и аудит.