Trigger (və ya trigger) — bu, verilənlər bazasında müəyyən hadisələrə reaksiya verən bir növ "callback" kimidir. Başqa sözlə, trigger — bu, INSERT, UPDATE və ya DELETE kimi əməliyyatlar icra olunanda avtomatik reaksiya verən bir mexanizmdir.
Təsəvvür elə ki, sənin ağıllı bir köməkçin var və o, sənin əvəzinə bəzi işləri görür. Məsələn, hər dəfə yeni bir tələbə haqqında qeyd əlavə edəndə, köməkçi avtomatik olaraq son dəyişiklik tarixini yeniləyir. Verilənlər bazasında trigger də eyni cür işləyir: o, hadisələri "dinləyir" və proqramlaşdırılmış reaksiyanı işə salır.
Trigger iki şeyi birləşdirir:
- Hadisə: cədvəldə nəsə baş verir (məsələn, qeyd əlavə olunur).
- Trigger-funksiyası: hadisə baş verəndə işləyən kod.
trigger funksiyasız mövcud ola bilməz. Funksiya trigger işə düşəndə nə etmək lazım olduğunu müəyyən edir.
Trigger-lərin istifadə nümunələri
Gəlin, trigger-lərin faydalı ola biləcəyi bir neçə vəziyyətə baxaq.
- Məlumatların avtomatik yenilənməsi
İstəyirsən ki, tələbələr haqqında qeydlərin saxlandığı cədvəldə last_modified adlı bir sahə olsun və bu sahə hər dəfə qeyd dəyişəndə avtomatik yenilənsin. Hər dəfə bu sahəni əl ilə yeniləmək əvəzinə, trigger yaradıb bu işi ona həvalə edə bilərsən.
- Dəyişikliklərin loglanması
İstəyirsən ki, kim və nə vaxt cədvəldəki məlumatları dəyişir, onu izləyə biləsən. Trigger hər dəfə məlumat dəyişəndə avtomatik olaraq audit (log) cədvəlinə qeyd əlavə edə bilər.
- Məlumatların yoxlanılması
Cədvələ əlavə olunan məlumatlar müəyyən qaydalara uyğun olmalıdırsa (məsələn, tələbənin yaşı 18-dən böyük olmalıdır), trigger məlumatlar əlavə olunmazdan əvvəl onları yoxlaya bilər.
- Avtomatik hesablamalar
orders cədvəlində sifarişləri saxlayırsan və hər dəfə yeni sifariş əlavə olunanda müştərinin ümumi alış məbləğini yeniləmək lazımdır. Bunu əl ilə etmək əvəzinə, trigger avtomatik olaraq məbləği yeniləyə bilər.
Trigger-ləri nə vaxt istifadə etməli
Artıq onların imkanlarını bildiyimizə görə, gəlin, trigger-ləri həqiqətən nə vaxt istifadə etməyə dəyər, onu müzakirə edək.
Loglama və audit: trigger-lər audit qeydləri yaratmaq üçün idealdır, beləliklə, vacib cədvəllərdəki dəyişiklikləri izləyə bilərsən.
Məlumatların bütövlüyünü qorumaq: məsələn, bazadan kursu siləndə, trigger avtomatik olaraq həmin kursla bağlı bütün tələbələri də silə bilər ki, "asılı" məlumatlar qalmasın.
Təkrarlanan tapşırıqların avtomatlaşdırılması: bu tapşırıqlara hesablama dəyərlərinin yenilənməsi, aqreqasiya olunmuş məlumatların yenilənməsi və s. daxildir.
Biznes-məntiqin DB-də reallaşdırılması: təkcə tətbiq koduna güvənmək əvəzinə, məntiqin bir hissəsini verilənlər bazasına köçürmək olar.
Trigger-lərin üstünlükləri
Yəqin artıq başa düşdün ki, trigger-lər güclü bir alətdir. Onlar nə verir:
Avtomatlaşdırma: minimum insan müdaxiləsi. Məsələn, məlumatları dəyişən istifadəçilərin izlənməsi avtomatik baş verir.
Kodun təkrarlanmasının azalması: inkişafçılar hər tətbiqdə yeniləmə və ya yoxlama məntiqini yazmaq əvəzinə, onu DB-yə yerləşdirə bilərik.
Məlumatların bütövlüyünün təminatı: trigger əlavə qoruma qatıdır ki, məlumatlar həmişə düzgün olsun.
Trigger-lərin mənfi tərəfləri
Təbii ki, hər bir alət kimi, trigger-lərin də mənfi tərəfləri var. Gəlin, onların "qara tərəfinə" baxaq:
Debug-un çətinliyi: trigger-lər "arxa planda" işləyir. Əgər gözlədiyin kimi işləmirsə, onları debug etmək çətin ola bilər.
Performans problemləri ola bilər: trigger çox mürəkkəbdirsə və ya çox tez-tez çağırılırsa, SQL-sorğuların icrasını ləngidə bilər.
Gizli məntiq: biznes-məntiq trigger-lərdə "basdırılıbsa", inkişafçılar üçün DB-də nə baş verdiyini anlamaq çətinləşir.
Real istifadə ssenariləri
Nümunə 1: Dəyişikliklərin loglanması
Tutaq ki, students cədvəlin var və orada tələbələr haqqında məlumat saxlanılır. Qeydlərdəki dəyişiklikləri izləmək istəyirsən. Bunun üçün trigger hər dəfə tələbə haqqında məlumat dəyişəndə audit_log cədvəlinə qeyd əlavə edəcək.
Nümunə 2: Avtomatik yenilənmə
students cədvəlində last_modified sütunu var. İstəyirsən ki, tələbə haqqında məlumat dəyişəndə bu dəyər avtomatik yenilənsin. Bunu update-dən sonra işə düşən trigger ilə etmək olar.
GO TO FULL VERSION