A MySQL triggerek 2005-ben, a MySQL 5.0 verziójában lettek bevezetve.
A triggerek lehetővé teszik az adatbázisok számára, hogy automatikusan reagáljanak az adatmódosításokra.
A MySQL triggerek olyan események, amelyek automatikusan végrehajtódnak amikor egy meghatározott esemény bekövetkezik egy adott táblában. Ezek az események segítenek automatizálni bizonyos folyamatokat, és biztosítják az adatkonzisztenciát.
(Az adatkonzisztencia az adatok pontosságát, megbízhatóságát és egymással való összhangját jelenti egy adatbázisban.)
A triggerek két fő összetevője:
A triggerek típusai:
Időzítés szerint a Mysql triggerek lehetnek:
Szintaxis:
CREATE TRIGGER trigger_nev
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON tabla_nev FOR EACH ROW
BEGIN
-- Trigger törzse (SQL utasítások)
END;
DROP TRIGGER trigger_nev;
Ez a parancs eltávolítja a megadott triggert az adatbázisból.
MySQL adatbázisokban a triggereket nem lehet közvetlenül módosítani a hagyományos értelemben. (Nincs rá utasítás.) Ha módosítani szeretnénk egy létező trigger logikáját, akkor először törölni kell a meglévő triggert, majd egy új triggert kell létrehozni a kívánt változtatásokkal.
Automatizálás: Ha rendszeresen ismétlődő műveleteket kell végrehajtani, például adatnaplózást vagy automatikus számításokat.
Adatintegritás: Ha biztosítani szeretnénk, hogy az adatok konzisztens állapotban maradjanak anélkül, hogy a felhasználóknak manuálisan kellene ezzel foglalkozniuk.
Üzletszabályok Kényszerítése: Ha bizonyos üzleti logikát vagy szabályokat ki szeretnénk kényszeríteni az adatokon keresztül.
Naplózás: Ha szükségünk van az adatok változásaival kapcsolatos történeti adatok gyűjtésére.
| Előny | Magyarázat |
|---|---|
| Automatikus végrehajtás | A triggereket automatikusan futtatják az adatbázis műveletei során, így csökkentve a hibák esélyét. |
| Adatok integritásának fenntartása | Segítenek biztosítani, hogy az adatbázishoz kapcsolódó szabályok és feltételek betartásra kerüljenek. |
| Könnyű karbantartás | Kód és logika központosítva, így könnyen módosítható, ha változnak az igények. |
| Naplózási lehetőségek | Lehetővé teszi a változtatások nyomon követését, így a hibák vagy problémák gyorsabban azonosíthatók. |
| Hátrány | Magyarázat |
|---|---|
| Teljesítmény | A triggerekkel végrehajtott logika lelassíthatja a műveleteket, különösen, ha bonyolultak vagy sok rekordot érintenek. |
| Bonyolultság | A triggereket nehezen lehet debug-olni, és a logika nem mindig nyilvánvaló más fejlesztők számára. |
| Túlzott használat | Ha túl sok trigger van egy adatbázisban, az felesleges bonyolítást okozhat, és nehézzé válhat a karbantartás. |
| Portabilitási kérdések | Más adatbázis-platformokra való migráláskor a triggereket nehéz átültetni, mert a szintaxis vagy a viselkedés eltérhet. |
A MySQL triggerek hasznos eszközök lehetnek az adatbázisok kezelésében, lehetőséget adva automatizált megoldások és integritási szabályok bevezetésére. Fontos, mérlegelni az előnyöket és hátrányokat, és csak akkor használjunk triggert, ha valóban szükséges. Triggerek alkalmazása előtt érdemes elgondolkodni a kód karbantartásán, a teljesítményen és a lehetőségeken, amelyekre a triggereket szeretnéd használni.
Az alábbi példa bemutatja egy egyszerű trigger létrehozását, amely naplózza a diákok táblájára vonatkozó beszúrási műveleteket.
Először hozzunk létre egy diakok nevű táblát, ahol a diákok adatait tároljuk:
CREATE TABLE diakok (
id INT PRIMARY KEY AUTO_INCREMENT ,
nev VARCHAR(100) NOT NULL,
eletkor INT NOT NULL
);
Hozzunk létre egy naplózó táblát, diakok_naplo-t is, amely tárolja a beszúrások időpontját. (Melyik rekordot mikor szúrták be a diakok táblába.):
CREATE TABLE diakok_naplo (
id INT PRIMARY KEY AUTO_INCREMENT,
diak_id INT,
beszuras_idopont DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (diak_id) REFERENCES diakok(id)
);
Hozzunk létre egy triggert, amely automatikusan rögzíti a diák adatokat a naplózó táblában, amikor új diákot szúrunk be:
DELIMITER //
CREATE TRIGGER diakok_beszuras
AFTER INSERT ON diakok
FOR EACH ROW
BEGIN
INSERT INTO diakok_naplo (diak_id) VALUES (NEW.id);
END;
//
DELIMITER ;
diakok táblába:INSERT INTO diakok (nev, eletkor) VALUES ('Kis Piroska', 21);
diakok_naplo táblát, hogy lássuk a naplózást:SELECT * FROM diakok_naplo;
A lekérdezés visszaadja, hogy mikor történt a beszúrás, és a hallgató ID-ját.
| id | diak_id | beszuras_idopont |
|---|---|---|
| 1 | 1 | 2026-03-03 08:39:11 |
I. feladat
CREATE TABLE diakok (
id INT AUTO_INCREMENT PRIMARY KEY,
nev VARCHAR(100) NOT NULL,
jegy INT NOT NULL
);
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
diak_id INT NOT NULL,
regi_jegy INT ,
uj_jegy INT ,
datum DATETIME DEFAULT CURRENT_TIMESTAMP
);
Készíts egy új trigger-t, amely rögzíti a törölt diák adatokat a "logs" táblában a törlés időpontjával együtt.
Készíts egy trigger-t, amely naplózza a diákok jegyeinek frissítését, módosítását a "logs" táblában.
II. feladat
dolgozok nevű táblánk, ahol a dolgozók adatainak nyilvántartása történik.
Hozz létre egy triggert, amely automatikusan naplózza az új dolgozók beillesztését egy dolgozok_log nevű táblába. A muvelet mezőt állítsa 'INSERT'-re.CREATE TABLE dolgozok (
id INT PRIMARY KEY AUTO_INCREMENT,
nev VARCHAR(100),
ber INT,
utolso_modositas TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE dolgozok_log (
log_id INT AUTO_INCREMENT PRIMARY KEY,
dolgozo_id INT,
muvelet VARCHAR(50),
log_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Hozzunk létre egy triggert, amely törlés esetén naplózza a törölt dolgozó adatait a dolgozok_log táblába. A muvelet mezőbe a 'DELETE' kerüljön.
Hozzunk létre egy triggert, amely figyeli, hogy mikor módosul a fizetés, és automatikusan frissíti a legutolsó módosítás dátumát a utolso_modositas mezőben. Valamint a dolgozok_log táblába is bejegyzi a módosítást (muvelet='UPDATE').