EMZETT.
Увійти

Збережені процедури та тригери: логіка в базі даних

Коротко: Збережені процедури — програми, що зберігаються в базі даних і викликаються; тригери виконуються автоматично під час вставки, зміни чи видалення даних.

Докладніше: Зазвичай застосунок надсилає базі даних окремі команди SQL. Але логіку можна розмістити і всередині бази даних. У цього є переваги та недоліки, які слід зважити.

Подробиці

Збережена процедура та функція

Іменована програма з SQL і керування потоком (цикли, умови), що викликається через CALL або SELECT. Приклад у PostgreSQL:

CREATE FUNCTION create_order(customer int, amount numeric)
RETURNS int LANGUAGE plpgsql AS $$
DECLARE new_id int;
BEGIN
  INSERT INTO orders (customer_id, amount) VALUES (customer, amount)
  RETURNING id INTO new_id;
  UPDATE customers SET revenue = revenue + amount WHERE id = customer;
  RETURN new_id;
END $$;

Мови: PL/pgSQL (PostgreSQL), T-SQL (SQL Server), PL/SQL (Oracle), процедури MySQL.

Тригер

Тригер виконується автоматично до або після INSERT, UPDATE чи DELETE:

CREATE TRIGGER change_time
BEFORE UPDATE ON article
FOR EACH ROW EXECUTE FUNCTION set_change_time();

Типове застосування: встановлення часу зміни, запис журналів аудиту, підтримання актуальності похідних значень, перевірка правил, яких не покриває просте обмеження.

Переваги

  • Менше мережевого трафіку: один виклик замість багатьох.
  • Логіка в одному місці, незалежно від того, який застосунок звертається до даних.
  • База даних гарантує правила, навіть якщо застосунок про них забув.
  • Виконання в транзакції поруч із даними.

Недоліки та альтернативи

Бізнес-логіку в базі даних складніше тестувати, версіонувати й налагоджувати, вона прив’язує до одного постачальника і може створювати піки навантаження на важко масштабований сервер бази даних. Приховані ефекти тригерів дивують розробників. Багато команд розміщують логіку в застосунку, а в базі даних використовують лише обмеження, індекси та прості тригери (аудит, позначка часу). Зміни процедур, як і код, належать до міграцій та системи контролю версій.

Див. також: SQL, Транзакції та ACID, Міграція бази даних, Журнал аудиту