Row-level trigger — DML statement ta’sir qilgan har bir satr uchun alohida ishga tushadigan database triggeridir. FOR EACH ROW bilan ifodalanadi. U OLD va NEW satr qiymatlariga bevosita kirib, satrga xos validation, audit yoki derived amalni bajaradi.
Chaqiruv soni
Bitta UPDATE 100 000 satrni o‘zgartirsa row-level trigger ham 100 000 marta ishlaydi. Trigger function juda kichik bo‘lsa ham context switch, query va indeks yozuvi umumiy katta xarajatga aylanadi. Bulk operatsiya benchmarkda real row soni bilan tekshiriladi.
Statement birorta satrga mos kelmasa row trigger chaqirilmaydi. Statement-level trigger esa statement uchun baribir bir marta ishlashi mumkin. Audit talabi “urinish”mi yoki “o‘zgargan har row”mi ekaniga qarab daraja tanlanadi.
OLD va NEW
INSERT’da odatda NEW, DELETE’da OLD, UPDATE’da ikkalasi mavjud. Trigger fieldlar o‘zgarganini OLD va NEW orqali taqqoslaydi. Null-safe equality ishlatilmasa NULLdan qiymatga yoki aksincha o‘zgarish o‘tkazib yuborilishi mumkin.
UPDATE trigger har update’da emas, ma’lum column ro‘yxatiga yozuv bo‘lganda ishga tushirilishi mumkin. Biroq column SET x=x shaklida o‘zgarmasa ham trigger chaqirilishi ehtimoli bor; qiymat farqi ichkarida tekshiriladi.
BEFORE row trigger
BEFORE variant NEW qiymatni o‘zgartirishi yoki row operationni rad etishi mumkin. Canonicalization, updated timestamp va oddiy derived field shunday bajariladi. Constraintlar barcha yakuniy qiymatlarni tekshirishi kerak.
Bir rowni silent tashlab yuborish affected count va data completenessni chalkashtiradi. Business qoida buzilsa explicit exception ko‘pincha aniqroq. Telemetry kabi tolerant oqimda rejected row alohida staging yoki dead-letter tablega yozilishi mumkin.
AFTER row trigger
AFTER variant saqlangan identity va final qiymat bilan audit yoki outbox yozadi. Asosiy rowni yana update qilish recursive trigger keltiradi. Derived boshqa tablega yozuv foreign key va lock ordering bilan bir transactionda bajariladi.
Bulk update’da har row uchun bir xil summary rowni update qilish contention va deadlock yaratadi. Statement-level transition table orqali aggregate delta bir marta hisoblanishi mumkin.
Concurrency
Trigger transaction isolationiga bo‘ysunadi. Boshqa rowlarni query qilib invariant tekshirsa parallel transaction ko‘rinmasligi mumkin. Noyoblik unique constraint, cross-row limit esa lock yoki serializable isolation bilan mustahkamlanadi.
Trigger bir nechta table’ni turli tartibda lock qilsa boshqa code path bilan deadlock yuz beradi. Deadlock database tomonidan transactionlardan birini rollback qilish bilan hal qilinadi; application retry idempotent bo‘lishi kerak.
Partition va replication
Partitioned table triggeri parent yoki child partitionda ishlashi engine va versiyaga bog‘liq. Row boshqa partitionga ko‘chadigan update delete-plus-insert sifatida ko‘rinishi mumkin. Audit operation turi platforma xatti-harakatiga mos talqin qilinadi.
Logical replication subscriber triggerlarni ishlatishi yoki bypass qilishi mumkin. Publisherda allaqachon audit yaratilgan bo‘lsa subscriberda yana trigger duplicate side effect beradi. Replication role va trigger enable rejimi aniq sozlanadi.
Testlash
Test INSERT, UPDATE, DELETE, null transition, bulk statement va rollbackni qamrab oladi. Trigger exceptionidan keyin asosiy row va side table o‘zgarmagani tekshiriladi. Performance testi row soni bilan chiziqli yoki undan yomon o‘sishni ko‘rsatadi.
Schema migration trigger function dependencylarini tekshiradi. Trigger vaqtincha disable qilinsa o‘tkazib yuborilgan side effectlarni tiklash rejasi mavjud bo‘ladi.
Bog‘liq tushunchalar
Database trigger, BEFORE trigger, AFTER trigger, Statement-level trigger, Transition table, Transaction isolation, Audit