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).