Trigger alapok
- A tiggerek olyan tárolt eljárások egy adatbázisban, amelyek automatikusan meghívásra kerülnek egy speciális esemény bekövetkezésekor. Azonban egy triggert közvetlenül nem tudunk meghívni.
- Pl.: Egy adott táblába új rekord beszúrásakor az adatbáziskezelő motor meghív egy eljárást.
- Minden triggerhez kapcsolódik egy adattábla.
- Főbb különbségek a tárolt eljárások és a triggerek között:
- A triggereket nem lehet kézzel meghívni vagy végrehajtani.
- A triggerek nem tudnak paramétereket fogadni.
- Egy tranczakciót nem lehet sem commitelni sem rollbackelni egy triggerben.
- Mikor van haszna a triggerek használatának?
- Amikor automatikusan szeretnénk műveleteket végrehajtani bizonyos adatbázisesemények kapcsán.
- Pl.: Ha szükségünk van arra, hogy lássuk milyen gyakorisággal frissül egy adattábla, akkor egy trigger segítségével erről adatokat rögzíthetünk egy másik táblába valahányszor az eredeti tábla frissítésre kerül.
- Három kategóriába soroljuk őket:
- DDL trigger: Adatdefiníciós eseményeket figyelnek. Pl.:
CREATE TABLE
, CREATE VIEW
, DROP TABLE
, DROP VIEW
és ALTER TABLE
.
- DML trigger: Adatmanipulációs eseményeket figyelnek. Pl.:
INSERT
, UPDATE
és DELETE
.
- Logon trigger: A bejelentkezési eseményeket figyelik. Ez akkor következik be amikor egy felhasználó bejelentkezése (azonosítása) sikeres volt, de még mielőtt létrejönne számára a session.
- Megjegyzés: Ahogy korábban is tapasztaltuk, az egyes adatbáziskezelő rendszerek között eltérő lehet a támogatott triggerek köre is. A MySQL például csak az
INSERT
, UPDATE
és DELETE
eseményekre támogat triggereket.
- Két típusát különítjük el:
row-level
: Minden rekordra aktiválásra kerül, amely kiváltja az eseményt (például frissítésre kerül).
- Például ha egy táblába 100 új rekordot illesztünk be, akkor az
INSERT
eseményt vizsgáló trigger 100 alkalommal kerül meghívásra.
statement-level
: Minden műveletre egyszer kerül végrehajtásra, függetlenül az érintett rekordok számától.
- A MySQL csak
row-level
triggereket támogat.
- A triggerek használatának néhány előnye:
- A segítségükkel növelhetjük az adatintegritást.
- Lehetővé teszik az üzleti szabályok és megszorítások használatát adatbázis szinten. Ezzel biztosítva a konzisztens és pontos adatot.
- A triggerek segítenek a rekord logok karbantartásában.
- Használhatjuk arra is, hogy nyomon kövessünk változásokat az adatokban, például logolva minden módosítást egy külön audit táblába.
- Idő és erőforrás takarítható meg a kliens oldalon a triggerek használatával.
- Automatizálhatunk vele ismétlődő vagy komplex feladatokat. Ezzel csökkenthetjük a manuális beavatkozások szükségességét és növelhetjük a hatékonyságot.
- A triggerek karbantartása könnyű.
- A triggerek használatának néhány hátránya:
- Az automatikus triggerek használatával a felhasználónak fogalma sincs róla, hogy azok mikor kerülnek végrehajtásra. Ezért az adatbázis szintjén keletkező problémák feltárása nehézkesebb.
- Az adatbázisszerver teljesítményigénye megnőhet.
Triggerek létrehozása
CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON table_name
FOR EACH ROW
BEGIN
-- Trigger body (SQL statements)
END;
- Egy új triggert a
CREATE TRIGGER
paranccsal tudunk létrehozni.
- Ezt követően a
BEFORE
vagy AFTER
kulcsszavak segítségével meghatározzuk, hogy mikor szeretnénk, hogy a trigger lefusson.
- A
BEFORE
a következőnek megadott esemény végrehajtása előtt, az AFTER
pedig utána fogja a triggert aktiválni.
- Az ez után írt
INSERT
, UPDATE
vagy DELETE
utasítások bekövetkeztét figyeli a rendszer.
- Az
ON
kulcsszóval elválasztva megadjuk a táblát, amin a megadott parancs végrehajtását vizsgáljuk.
- A
FOR EACH ROW
kifejezéssel megadjuk, hogy a trigger rekord-szintű legyen. Más szavakkal: Minden érintett rekord esetén kerüljön végrehajtásra.
- A trigger végén
BEGIN
és END
kulcsszavak közé írjuk azokat a parancsokat, amelyeket végre akarunk hajtani amennyiben a trigger meghívásra kerül.
- Ezek a parancsok hozzáférnek annak a mezőnek az adataihoz, amely kiváltotta a trigger aktiválódását.
- A mezőnek elérhető az értéke a kiváltó művelet előtt és utáni állapotból is az
OLD
és NEW
kulcsszavak használatával.
- Például: Ha egy értéket frissítünk a
description
mezőben, akkor a trigger törzsében elérhető a mező frissítés előtti értéke az OLD.description
és az új értéke is a NEW.description
kulcsszavakkal.
DELIMITER //
CREATE TRIGGER update_items_trigger
AFTER UPDATE
ON items
FOR EACH ROW
BEGIN
INSERT INTO item_changes (item_id, change_type)
VALUES (NEW.id, 'UPDATE');
END//
DELIMITER ;
-
Lehetőségünk van egy eseményre több triggert is definiálni ugyanarra a táblára. Ilyenkor az új triggerek létrehozásánál meg kell adnunk, hogy azok milyen prioritás szerint kerüljenek végrehajtásra.
DELIMITER $$
CREATE TRIGGER trigger_name
{BEFORE|AFTER}{INSERT|UPDATE|DELETE}
ON table_name FOR EACH ROW
{FOLLOWS|PRECEDES} existing_trigger_name
BEGIN
-- statements
END$$
DELIMITER ;
- A
FOLLOWS
kulcsszóval megadhatjuk, hogy a trigger egy már korábban létrehozott trigger után fusson le.
- A
PRECEDES
kulcsszóval pedig azt mondjuk meg, hogy melyik másik trigger előtt fusson le az új trigger.
Triggerek törlése
-
Egy triggert a DROP
kulcsszóval tudunk törölni.
DROP TRIGGER trigger_name;
-
Ha egy táblát törlünk, akkor minden hozzá kapcsolódó trigger automatikusan törlésre kerül.