CodeGym /Kurslar /SQL SELF /Trigger sintaksisinin əsasları: CREATE TRIGGER, WHEN, EXE...

Trigger sintaksisinin əsasları: CREATE TRIGGER, WHEN, EXECUTE FUNCTION

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

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ı (BEFORE və ya AFTER).
  • 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, namelast_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?

  1. NEW — xüsusi dəyişən, yeni sətrin dəyərlərini saxlayır (INSERT və ya UPDATE hadisələri üçün).
  2. CURRENT_TIMESTAMP — cari tarix və saatı qaytaran funksiya.
  3. 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: trigger students cə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.

2
Tapşırıq
SQL SELF, səviyyə, dərs
Bağlanıb
Sadə loglaşdırma triggerinin yaradılması
Sadə loglaşdırma triggerinin yaradılması
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION