CodeGym /Kurslar /SQL SELF /Verilənlərin yenilənməsi üçün sadə trigger yaradılması: A...

Verilənlərin yenilənməsi üçün sadə trigger yaradılması: AFTER INSERT

SQL SELF
Səviyyə , Dərs
Mövcuddur

Təsəvvür elə ki, bizdə tələbələr haqqında məlumat saxlayan bir cədvəl var. Bu cədvəldə hər dəfə yeni tələbə əlavə olunanda last_modified (qeydin son dəyişmə tarixi) sahəsini avtomatik yeniləmək lazımdır. Bu sahə dəyişiklikləri izləmək və məlumatlara nəzarət üçün vacibdir.

Ssenari belə işləyir:

  1. Cədvələ yeni qeyd əlavə olunanda last_modified sahəsinə avtomatik olaraq cari tarix və saat yazılır.
  2. Biz AFTER INSERT trigger-indən istifadə edəcəyik, hansı ki, məlumat uğurla əlavə olunduqdan sonra işləyəcək.

Trigger üçün funksiya yaradılması

Əvvəlcə PL/pgSQL dilində funksiya yaratmaq lazımdır. Bu funksiya bizim cədvəldə last_modified sahəsini yeniləyəcək. Funksiya trigger-in işləməsi üçün mütləqdir, çünki trigger sadəcə nə etmək lazım olduğunu göstərir, bütün məntiqi isə funksiya icra edir.

Başlayaq cədvəl yaratmaqdan:

-- students cədvəlini yaradırıq
CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    age INT NOT NULL,
    last_modified TIMESTAMP
);

İndi isə last_modified sahəsini yeniləyən funksiya yaradaq:

-- last_modified üçün funksiya
CREATE OR REPLACE FUNCTION update_last_modified()
RETURNS TRIGGER AS $$
BEGIN
    -- last_modified sahəsinə cari vaxtı yazırıq
    NEW.last_modified := NOW();
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

Gəlin baxaq bu funksiya nə edir:

  • CREATE OR REPLACE FUNCTION update_last_modified()update_last_modified adlı funksiya yaradırıq. Əgər belə funksiya artıq varsa, o dəyişdiriləcək.
  • RETURNS TRIGGER — göstəririk ki, funksiya trigger üçün nəzərdə tutulub.
  • NEW.last_modified := NOW();NOW() funksiyası ilə last_modified sahəsini cari tarix və saatla yeniləyirik.
  • RETURN NEW; — yenilənmiş qeydi qaytarırıq. Bu, AFTER trigger-i üçün mütləqdir.

Trigger yaradılması

Funksiya yaradıldıqdan sonra trigger-in özünü yarada və onu students cədvəlinə bağlaya bilərik. Bunu belə edirik:

-- Qeyd əlavə olunandan sonra trigger yaradırıq
CREATE TRIGGER set_last_modified
AFTER INSERT ON students
FOR EACH ROW
EXECUTE FUNCTION update_last_modified();

Burada nə baş verir:

  • CREATE TRIGGER set_last_modifiedset_last_modified adlı trigger yaradırıq.
  • AFTER INSERT — trigger cədvələ yeni sətir uğurla əlavə olunandan sonra işləyəcək.
  • ON students — trigger students cədvəlinə bağlıdır.
  • FOR EACH ROW — cədvələ əlavə olunan hər yeni sətir üçün trigger işləyəcək.
  • EXECUTE FUNCTION update_last_modified(); — əvvəl yaratdığımız funksiyanı çağırırıq.

Qeyd: trigger-in (set_last_modified) və funksiyanın (update_last_modified) adını istədiyin kimi seçə bilərsən, amma kodun başa düşülməsi üçün adlandırma standartlarına riayət etmək yaxşıdır.

Trigger-in test edilməsi

Gəlin trigger-in necə işlədiyini yoxlayaq. Əvvəlcə students cədvəlinə bir neçə qeyd əlavə edək:

-- Cədvələ məlumat əlavə edirik
INSERT INTO students (name, age) VALUES ('İvan İvanov', 20);
INSERT INTO students (name, age) VALUES ('Anna Petrova', 22);

İndi cədvəldə nə baş verdiyinə baxaq:

-- Cədvəldəki məlumatlara baxırıq
SELECT * FROM students;

Gözlənilən nəticə təxminən belə olacaq:

id name age last_modified
1 Otto Min 20 2023-10-10 14:30:45
2 Anna Sonq 22 2023-10-10 14:31:12

Fikir ver, last_modified sahəsi hər qeyd üçün avtomatik olaraq cari tarix və saatla doldurulub.

Baş verə biləcək səhvlər

  1. Səhv: "relation does not exist" trigger yaradanda. Bu səhv students cədvəli yaradılmayıbsa çıxır. Trigger yaratmazdan əvvəl cədvəli yaratdığına əmin ol.
  2. Giriş hüququ səhvi. Əgər database istifadəçisinin funksiya və ya trigger yaratmağa icazəsi yoxdursa, trigger yaradılmayacaq. İstifadəçi hüquqlarını yoxla.
  3. Trigger-də funksiya çağırılmır. Əgər EXECUTE FUNCTION update_last_modified() yazmağı unutsan, trigger lazım olan əməliyyatı yerinə yetirə bilməyəcək.

Trigger-in təkmilləşdirilməsi: şərtlərin əlavə olunması

Real tapşırıqlarda trigger-in işləməsini müəyyən şərtlərlə məhdudlaşdırmaq faydalı ola bilər. Məsələn, əgər age sahəsi 18-dən kiçikdirsə, last_modified yenilənməsin istəyirik. Bunu WHEN şərti ilə edə bilərik:

-- Şərtli trigger yaradırıq
CREATE TRIGGER set_last_modified
AFTER INSERT ON students
FOR EACH ROW
WHEN (NEW.age >= 18)
EXECUTE FUNCTION update_last_modified();

İndi last_modified sahəsi yalnız yaşı >= 18 olan tələbələr üçün yenilənəcək.

Praktiki tətbiq

Bu kimi trigger-lər real layihələrdə tez-tez istifadə olunur. Bir neçə nümunə:

  • Qeydin son dəyişmə vaxtının avtomatik yenilənməsi (bizim etdiyimiz kimi).
  • Bazadakı dəyişiklikləri izləmək və bu dəyişiklikləri log cədvəlinə yazmaq.
  • Məlumatların bütövlüyünü təmin etmək, məsələn, əməliyyatdan əvvəl əlaqəli cədvəlləri yoxlamaq.
  • Hüquqi və ya korporativ qaydalara uyğunluq üçün məlumatların auditi.

Bu bacarıqlar xüsusilə dəqiq və etibarlı məlumatların vacib olduğu sistemlərdə, məsələn, bank sistemləri, ehtiyat idarəetmə və ya CRM-lərdə işləyirsənsə, çox faydalıdır.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION