Ugrás a fő tartalomhoz

PL/SQL triggerek

Mi az a trigger?​

A trigger egy automatikusan végrehajtódó PL/SQL blokk, amely egy adatbázis-esemény hatására fut le (pl. INSERT, UPDATE, DELETE).

Segítségével ellenőrzéseket, naplózást, számításokat vagy más műveleteket végezhetünk adatváltozáskor.

DML triggerek​

A leggyakoribb trigger típus. Egy DML trigger akkor fut le, amikor egy adott táblán INSERT, UPDATE vagy DELETE művelet történik.

Sorrend alapján​

TípusMikor fut le
BEFORE triggerA művelet előtt
AFTER triggerA művelet után

Szint alapján​

TípusLeírás
Row-level (FOR EACH ROW)Minden érintett sorra lefut
Statement-levelEgyszer fut le az egész utasításra

Trigger szerkezete​

CREATE [OR REPLACE] TRIGGER trigger_nev
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON tabla_nev
[FOR EACH ROW]
[WHEN (feltétel)]
BEGIN
-- Trigger logika
END;

Példa – AFTER INSERT trigger​

CREATE OR REPLACE TRIGGER trg_new_employee
AFTER INSERT ON employees
FOR EACH ROW
BEGIN
DBMS_OUTPUT.PUT_LINE('Új dolgozó beszúrva: ' || :NEW.first_name);
END;

Magyarázat:

  • :NEW – az új sor értékeihez férünk hozzá
  • :OLD – a régi (módosítás előtti) értékekhez
  • FOR EACH ROW – minden érintett sorra lefut

Példa – BEFORE UPDATE trigger​

CREATE OR REPLACE TRIGGER trg_check_salary
BEFORE UPDATE OF salary ON employees
FOR EACH ROW
BEGIN
IF :NEW.salary < :OLD.salary THEN
RAISE_APPLICATION_ERROR(-20001, 'Nem csökkenthető a fizetés!');
END IF;
END;

Magyarázat:

  • Csak a salary oszlop frissítésekor fut le
  • A RAISE_APPLICATION_ERROR beépített eljárással hibát dobunk (saját hibaüzenettel)

Példa – Naplózó trigger​

CREATE OR REPLACE TRIGGER trg_log_deletions
AFTER DELETE ON employees
FOR EACH ROW
BEGIN
INSERT INTO emp_log (emp_id, deleted_at)
VALUES (:OLD.employee_id, SYSDATE);
END;

Cél: Minden törölt dolgozóról bejegyzést készítünk az emp_log táblába.

:OLD és :NEW pszeudo-rekordok​

KontextusElérhető adatok
INSERTCsak :NEW
UPDATE:OLD és :NEW is
DELETECsak :OLD

Korlátozások​

  • Nem használható COMMIT, ROLLBACK, SAVEPOINT utasítás a triggerben.
  • Vigyázzunk a rekurzív triggerekre, amelyek végtelen hívást okozhatnak!
  • Használjunk WHEN feltételt, ha csak bizonyos esetekben akarjuk futtatni a triggert.

Példa – Feltételes trigger​

CREATE OR REPLACE TRIGGER trg_high_salary
BEFORE INSERT OR UPDATE ON employees
FOR EACH ROW
WHEN (NEW.salary > 1000000)
BEGIN
DBMS_OUTPUT.PUT_LINE('Figyelem: magas fizetés!');
END;

Feladatok​

1. Feladat​

Készíts egy AFTER INSERT triggert az employees táblára, ami minden új dolgozó beszúrásakor kiírja a nevét és fizetését.

2. Feladat​

Írj BEFORE UPDATE triggert, amely megakadályozza, hogy egy dolgozó fizetését 50%-nál nagyobb mértékben csökkentsék.

3. Feladat​

Hozz létre egy AFTER DELETE triggert, ami naplózza a törölt dolgozók adatait egy employees_deleted táblába (id, név, törlés ideje).