Триггеры и события
Автоматическая логика на стороне базы данных: срабатывает при изменении данных или по расписанию
Главная идея: триггер — это блок SQL, который база данных выполняет автоматически каждый раз, когда в таблице вставляется, обновляется или удаляется строка. Вы его не вызываете — это делает движок. Событие — та же идея, но по часам: SQL, который запускается по расписанию без участия приложения. И то и другое переносит логику внутрь базы данных, что мощно для журналов аудита и производных данных, но это ещё и скрытая логика, которую не найдёт ни один
grep по коду приложения.
К концу этой темы вы сможете:
- писать триггеры
BEFOREиAFTERдляINSERT,UPDATEиDELETE; - правильно читать и записывать псевдострочки
NEWиOLD; - строить два классических шаблона: журнал аудита и производные / денормализованные данные;
- проверять или отклонять изменение с помощью
SIGNAL; - планировать регулярное обслуживание через
CREATE EVENT; и - честно оценивать, когда скрытая логика в базе помогает, а когда вредит сопровождаемости.
1. Пример схемы
Все запросы этой темы работают с одной небольшой базой магазина. Мы храним товары, заказы покупателей, позиции каждого заказа и таблицу аудита, которая будет фиксировать изменения цен.
CREATE TABLE products (
product_id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(80) NOT NULL,
price DECIMAL(10,2) NOT NULL,
stock INT NOT NULL DEFAULT 0
);
CREATE TABLE orders (
order_id INT PRIMARY KEY AUTO_INCREMENT,
customer VARCHAR(80) NOT NULL,
status VARCHAR(20) NOT NULL DEFAULT 'new',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE order_items (
item_id INT PRIMARY KEY AUTO_INCREMENT,
order_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT NOT NULL
);
CREATE TABLE price_audit (
audit_id INT PRIMARY KEY AUTO_INCREMENT,
product_id INT NOT NULL,
old_price DECIMAL(10,2),
new_price DECIMAL(10,2),
changed_by VARCHAR(80),
changed_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO products (name, price, stock) VALUES
('Notebook', 3.50, 100),
('Pen', 1.20, 40),
('Backpack', 25.00, 10);
На полке три товара. Всё, что ниже, добавляет поведение, срабатывающее автоматически при изменении этих таблиц.