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ípus | Mikor fut le |
|---|---|
| BEFORE trigger | A művelet előtt |
| AFTER trigger | A művelet után |
Szint alapján
| Típus | Leírás |
|---|---|
Row-level (FOR EACH ROW) | Minden érintett sorra lefut |
| Statement-level | Egyszer 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ékekhezFOR 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
salaryoszlop frissítésekor fut le - A
RAISE_APPLICATION_ERRORbeé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
| Kontextus | Elérhető adatok |
|---|---|
INSERT | Csak :NEW |
UPDATE | :OLD és :NEW is |
DELETE | Csak :OLD |
Korlátozások
- Nem használható
COMMIT,ROLLBACK,SAVEPOINTutasítás a triggerben. - Vigyázzunk a rekurzív triggerekre, amelyek végtelen hívást okozhatnak!
- Használjunk
WHENfelté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).