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:
- Cədvələ yeni qeyd əlavə olunanda
last_modifiedsahəsinə avtomatik olaraq cari tarix və saat yazılır. - Biz
AFTER INSERTtrigger-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_modifiedadlı 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_modifiedsahəsini cari tarix və saatla yeniləyirik.RETURN NEW;— yenilənmiş qeydi qaytarırıq. Bu,AFTERtrigger-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_modified—set_last_modifiedadlı 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— triggerstudentscə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
- Səhv: "relation does not exist" trigger yaradanda. Bu səhv
studentscədvəli yaradılmayıbsa çıxır. Trigger yaratmazdan əvvəl cədvəli yaratdığına əmin ol. - 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.
- 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.
GO TO FULL VERSION