Bosh sahifa Wiki Trigger

Trigger

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:

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:

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:

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