Към съдържанието
wannacode

Тригери

Накратко: Тригерът е набор от заявки, които базата пуска сама при INSERT, UPDATE или DELETE в таблица, например за дневник на цените или за наличността.

Проблем

Кой смени цената?

Клиент се оплаква, че вчера кафето е струвало по-малко. В базата има само днешната цена. Кога е сменена и от колко? Няма откъде да се разбере.

Можеш да накараш всяка програма, която пипа цените, да пише и в дневник. Но някой ще забрави: скрипт за поскъпване, ръчна поправка, нова програма след година.

Идеята

Тригер

Тригерът е заявка, която базата пуска сама, когато нещо се промени в таблица. Пише се веднъж и важи за всеки, който пише в базата.

SQLбаза: магазин
  • AFTER UPDATE OF price ON products: след всяка промяна на цената.
  • WHEN OLD.price <> NEW.price: само ако цената наистина е различна.
  • OLD е редът преди промяната, NEW след нея.
  • Между BEGIN и END са заявките на тригера. Тук не значат транзакция, а тялото му.

Двете промени на цената са в дневника, без програмата да знае за него.

Виж го

Наличността сама

Тригер може и да поддържа данни: всеки нов ред в поръчка намалява наличността на продукта.

SQLбаза: магазин

Ябълките са били 80, сега са 77. Тригерът работи в същата транзакция като INSERT. Ако поръчката се върне с ROLLBACK, връща се и наличността.

Пробвай

Сигнал за лош отзив

Таблицата alerts (review_id, product_id) вече я има. Напиши тригер, който при нов отзив с оценка 1 записва в alerts номера на отзива и продукта. Проверката добавя два отзива, с оценка 1 и 5, и гледа alerts.

SQLбаза: магазин

Идеята

Кога да, кога не

Тригерите са добри за неща, които трябва да станат винаги, каквато и програма да пише: дневник на промените, поддържане на изчислена колона, проверка, която CHECK не може да направи.

Цената им: логиката е скрита. Който чете кода на програмата, вижда един INSERT, а базата прави още три неща. Тригер, който пуска тригер, който пуска тригер, се отстранява трудно. Бизнес правила като отстъпки и промоции обикновено са по-ясни в кода на програмата.

По-точно, за любопитните

В PostgreSQL тялото на тригера е отделна функция (CREATE FUNCTION … RETURNS trigger, после CREATE TRIGGER … EXECUTE FUNCTION). Има и BEFORE тригери, които могат да променят NEW, преди редът да влезе. SQLite има и BEFORE, и INSTEAD OF за изгледи.

Тест

Провери се

1. Какво са OLD и NEW в тригер след UPDATE?
2. Тригерът се изпълнява…
3. Кое е недостатък на тригерите?

Създаден от Иво Гергов като част от кампанията на Evo Tech за достъпно обучение по програмиране ·