Trigger — ma’lumotlar bazasida ma’lum hodisa yuz berganda avtomatik ishga tushadigan server-side dasturiy obyekt. Trigger insert, update, delete, truncate yoki ayrim DDL hodisalariga javob berishi mumkin.
Trigger application alohida chaqirmasa ham database ichida ishlaydi. Shu sababli u ma’lumot yaxlitligi, audit va derivativ qiymatlar uchun kuchli, ammo yashirin side effect manbai ham bo‘lishi mumkin.
DML trigger
DML trigger table yoki view’dagi data o‘zgarishiga javob beradi.
Asosiy hodisalar:
INSERT;UPDATE;DELETE.
Trigger bitta yoki bir nechta hodisa uchun yaratilishi mumkin.
BEFORE trigger
BEFORE trigger asosiy amal bajarilishidan oldin ishlaydi.
U:
- qiymatni normalizatsiya qilish;
- validation;
- default hisoblash;
- noto‘g‘ri amalni rad etish
uchun ishlatilishi mumkin.
Masalan, email qiymatini lowercase holatga keltirish.
AFTER trigger
AFTER trigger asosiy operation muvaffaqiyatli bajarilgandan keyin ishlaydi.
U:
yaratishi mumkin.
Trigger transaction ichida ishlasa, trigger xatosi asosiy operationni ham rollback qilishi mumkin.
INSTEAD OF trigger
Ayrim view yoki maxsus obyektlarda asosiy amal o‘rniga trigger ishlaydi.
Masalan, murakkab view’ga insert kelganda trigger ma’lumotni bir nechta base table’ga ajratadi.
Bu view’ni updatable interface sifatida ko‘rsatadi.
Row-level trigger
Har o‘zgargan row uchun alohida ishlaydi.
Agar bitta statement million rowni update qilsa trigger million marta bajarilishi mumkin.
Bu performance va side effect hajmiga katta ta’sir qiladi.
Statement-level trigger
Bitta SQL statement uchun bir marta ishlaydi.
U umumiy hodisa va batch darajasidagi operation uchun qulay.
O‘zgargan rowlar to‘plamiga access imkoniyati database’ga bog‘liq.
OLD va NEW qiymatlar
Trigger ko‘pincha oldingi va yangi row holatini ko‘ra oladi.
Masalan:
OLD.status = 'pending'
NEW.status = 'paid'
Bu status transition auditini yozishga yordam beradi.
Insertda oldingi qiymat, deleteda yangi qiymat mavjud bo‘lmasligi mumkin.
Audit trigger
Muhim table o‘zgarishlari audit table’ga yoziladi.
Audit record:
- table;
- row ID;
- operation;
- oldingi qiymat;
- yangi qiymat;
- user;
- vaqt;
- transaction ID
saqlashi mumkin.
Maxfiy fieldlar mask qilinadi.
History table
Trigger rowning eski versiyasini history table’ga ko‘chirishi mumkin.
Bu temporal tahlil va tiklash uchun ishlatiladi.
History table hajmi tez o‘sishi mumkin.
Retention, partition va index rejalashtiriladi.
Derived data
Trigger dependent qiymatni yangilashi mumkin.
Masalan, order item o‘zgarganda order total qayta hisoblanadi.
Biroq bir xil qiymatni application va trigger ikkalasi boshqarsa nomuvofiqlik yuz beradi.
Derived value real vaqt talab qilmasa materialized view yoki background aggregation qulayroq bo‘lishi mumkin.
Constraint o‘rnidagi trigger
Oddiy invariantlar uchun built-in constraint afzal:
NOT NULL;- unique;
- foreign key;
- check.
Trigger murakkab cross-table qoida uchun ishlatilishi mumkin.
Built-in constraint optimizer va database tomonidan yaxshiroq tushuniladi.
Recursion
Trigger ichidagi amal yana o‘sha yoki boshqa triggerni ishga tushirishi mumkin.
Bu:
- recursion;
- trigger chain;
- cycle;
- juda chuqur call stack
yaratadi.
Database recursion limit yoki trigger depth qo‘llashi mumkin.
Trigger qaysi table’larni o‘zgartirishi aniq hujjatlashtiriladi.
Transaction
Trigger odatda asosiy statement transactionining bir qismidir.
Trigger yozuvi commit bo‘lmasa saqlanmaydi.
Bu atomicity beradi.
Ammo trigger ichida tashqi HTTP request yoki email yuborish transaction rollback bilan bekor qilinmaydi.
Tashqi side effect uchun outbox yoki background worker ishlatiladi.
Bulk operation
Row-level trigger katta importni keskin sekinlashtirishi mumkin.
Masalan, har row uchun:
bajarilsa N+1ga o‘xshash yuk paydo bo‘ladi.
Statement-level yoki batchga mos yondashuv ko‘rib chiqiladi.
Error handling
Trigger validation xatosi aniq database error code va tushunarli message bilan qaytarilishi mumkin.
Noaniq exception applicationga “internal error” sifatida ko‘rinadi.
Trigger xatosi qaysi row va qaysi invariant bilan bog‘liqligi logda qayd etiladi.
Deployment
Trigger schema migration orqali versionlanadi.
CREATE OR REPLACE yoki drop-create jarayoni database imkoniyatiga bog‘liq.
Rolling deployment vaqtida eski va yangi application trigger semantikasi bilan mos bo‘lishi kerak.
Test
Trigger quyidagi holatlarda test qilinadi:
- insert;
- update;
- delete;
- bulk statement;
- rollback;
- parallel transaction;
- recursion;
- permission;
- null;
- xato.
Faqat bir rowli happy path yetarli emas.
Observability
Trigger yashirin ishlagani sabab query latency va lock vaqtiga ta’siri monitoring qilinadi.
Execution statistics, slow query, audit hajmi va deadlock trigger bilan bog‘lanishi mumkin.
Trigger nomi va vazifasi schema dokumentatsiyasida ko‘rsatiladi.
Trigger order
Bitta table va hodisa uchun bir nechta trigger mavjud bo‘lsa ularning bajarilish tartibi database qoidalariga bog‘liq.
Logic tartibga qattiq tayanmasligi yoki explicit nom va dependency bilan boshqarilishi kerak.
Bir trigger yozgan qiymatni keyingi trigger o‘qishi mumkin.
Triggerni vaqtincha o‘chirish
Bulk migration paytida triggerni o‘chirish katta xavf tug‘diradi.
Shu davrda audit, validation yoki history yozuvi ishlamasligi mumkin.
Agar o‘chirish zarur bo‘lsa replacement validation, maintenance lock va keyingi reconciliation rejalashtiriladi.
Bog‘liq tushunchalar
Database trigger, BEFORE trigger, AFTER trigger, Row-level trigger, Statement-level trigger, Audit, Transaction, Constraint, Stored procedure, Outbox pattern