Перейти к содержанию

Начало урока

Триггеры и события

Автоматическая логика на стороне базы данных: срабатывает при изменении данных или по расписанию

Главная идея: триггер — это блок 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);

На полке три товара. Всё, что ниже, добавляет поведение, срабатывающее автоматически при изменении этих таблиц.

Продолжите этот урок на YourAIZone

В полном уроке — объяснение целиком, разобранные примеры, частые ошибки, тесты с мгновенной проверкой и ИИ-репетитор. Начните сразу как гость или создайте аккаунт, чтобы сохранять прогресс.

В полном уроке

  • Объяснение целиком
  • Разобранные примеры
  • Частые ошибки и как их избежать
  • Тестовые вопросы: 15
  • ИИ-репетитор, который отвечает на вопросы по теме
  • Отслеживание прогресса для ученика, родителей и учителя