PostgreSQL-də trigger yaratmaq üçün aşağıdakı komponentləri müəyyən etməlisən:
- Trigger-in adı.
- Hadisə tipi (
INSERT,UPDATE,DELETE). - İcra olunma anı (
BEFOREvə yaAFTER). - Hansı cədvələ aid olduğu.
- İcra olunacaq funksiya (PL/pgSQL və ya başqa dildə).
Bax belə ümumi komanda strukturu var:
CREATE TRIGGER trigger_adı
[BEFORE | AFTER] {INSERT | UPDATE | DELETE}
ON cədvəl_adı
[FOR EACH ROW | FOR EACH STATEMENT]
WHEN (şərt)
EXECUTE FUNCTION funksiya_adı();
Sadə trigger nümunəsi
Gəlin students adlı əsas bir cədvəl yaradaq və ora yeni qeyd əlavə olunanda işləyən trigger əlavə edək.
Əvvəlcə students cədvəlini yaradaq
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
last_modified TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Burda nə baş verir? Biz id, name və last_modified sahələri olan bir cədvəl yaratdıq. last_modified sahəsi qeyd-in son dəyişmə tarixini və saatını saxlayacaq.
Trigger-lər həmişə funksiyalara bağlı olur. Əvvəlcə hər qeyd əlavə olunanda last_modified sahəsini yeniləyən sadə funksiya yaradaq:
CREATE OR REPLACE FUNCTION update_last_modified()
RETURNS TRIGGER AS $$
BEGIN
-- last_modified sahəsinə cari tarix və saatı yazırıq
NEW.last_modified := CURRENT_TIMESTAMP;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
Bu nə cür magiyadır?
NEW— xüsusi dəyişən, yeni sətrin dəyərlərini saxlayır (INSERTvə yaUPDATEhadisələri üçün).CURRENT_TIMESTAMP— cari tarix və saatı qaytaran funksiya.RETURN NEW— dəyişdirilmiş sətri saxlanmaq üçün qaytarır.
İndi isə trigger-in özünü yaradaq:
CREATE TRIGGER set_last_modified
AFTER INSERT
ON students
FOR EACH ROW
EXECUTE FUNCTION update_last_modified();
Açıqlama:
AFTER INSERT: trigger yeni sətr əlavə olunandan sonra işləyir.ON students: triggerstudentscədvəlinə tətbiq olunur.FOR EACH ROW: hər yeni sətr üçün trigger işləyir.EXECUTE FUNCTION: hansı funksiyanın çağırılacağını göstərir.
Trigger-in işləməsini yoxlayaq
Gəlin trigger-in necə işlədiyinə baxaq:
INSERT INTO students (name) VALUES ('Alice');
SELECT * FROM students;
Təxminən belə nəticə görəcəksən:
| id | name | last_modified |
|---|---|---|
| 1 | Alice | 2023-10-15 14:23:45 |
Trigger avtomatik olaraq last_modified sahəsini yenilədi. Magiya? Yox, sadəcə PostgreSQL.
WHEN ilə şərtlərdən istifadə
Bəzən trigger-in həmişə yox, yalnız müəyyən şərtlərdə işləməsini istəyirik. Bunun üçün WHEN açar sözü istifadə olunur.
Gəlin bir nümunəyə baxaq, burada trigger yalnız müəyyən dəyərlər üçün işləyir.
Tutaq ki, istəyirik trigger yalnız adı "Alice" olan tələbələr üçün işləsin. Trigger-i dəyişirik:
CREATE OR REPLACE FUNCTION update_last_modified_condition()
RETURNS TRIGGER AS $$
BEGIN
NEW.last_modified := CURRENT_TIMESTAMP;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER set_last_modified_condition
AFTER INSERT
ON students
FOR EACH ROW
WHEN (NEW.name = 'Alice')
EXECUTE FUNCTION update_last_modified_condition();
İndi trigger last_modified sahəsini yalnız adı "Alice" olan tələbələr üçün yeniləyəcək.
Yoxlayaq:
INSERT INTO students (name) VALUES ('Alice');
INSERT INTO students (name) VALUES ('Bob');
SELECT * FROM students;
Nəticə:
| id | name | last_modified |
|---|---|---|
| 1 | Alice | 2023-10-15 14:30:00 |
| 2 | Bob | (NULL) |
Diqqət et: "Bob" üçün last_modified sahəsi boş qaldı, çünki trigger işləmədi.
Trigger-in funksiya ilə əlaqəsi: EXECUTE FUNCTION
Funksiya — hər trigger-in ürəyidir. Trigger funksiyasız mövcud ola bilməz, çünki məntiqi məhz funksiya müəyyən edir. PostgreSQL-də funksiyaları PL/pgSQL və ya Python, C kimi digər dəstəklənən dillərdə yazmaq olar.
Gəlin PL/pgSQL funksiyasının istifadəsinə bir nümunə göstərək.
Bir funksiya yaradaq ki, dəyişiklikləri ayrıca audit_log cədvəlində log-lasın.
Əvvəlcə audit_log cədvəlini yaradaq
CREATE TABLE audit_log (
id SERIAL PRIMARY KEY,
operation TEXT NOT NULL,
student_id INTEGER NOT NULL,
log_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
İndi isə funksiya:
CREATE OR REPLACE FUNCTION log_insert()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO audit_log (operation, student_id)
VALUES ('INSERT', NEW.id);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
İndi trigger-i yazırıq:
CREATE TRIGGER log_student_insert
AFTER INSERT
ON students
FOR EACH ROW
EXECUTE FUNCTION log_insert();
Və işləməsini yoxlayaq:
INSERT INTO students (name) VALUES ('Charlie');
SELECT * FROM audit_log;
Təxminən belə nəticə görəcəksən:
| id | operation | student_id | log_time |
|---|---|---|---|
| 1 | INSERT | 3 | 2023-10-15 14:35:00 |
Trigger avtomatik olaraq yeni qeyd barədə log yazdı.
Trigger-lərlə işləyərkən səhvlər və xüsusiyyətlər
Səhv: funksiya yoxdur. Əgər trigger-i funksiyasız yaratmağa çalışsan, PostgreSQL səhv verəcək. Həmişə əvvəl funksiyanı yarat, sonra trigger-i.
Performans problemləri. Çoxlu trigger və ya mürəkkəb funksiyalar bazanın işləmə sürətini azalda bilər. Onlardan ehtiyatla istifadə et.
Rekursiya. Əgər trigger eyni cədvəldə dəyişiklik edirsə, bu sonsuz dövr yarada bilər. Bunu WHEN şərtləri ilə qarşısını al.
GO TO FULL VERSION