Triggerek

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:

A MySQL trigger fő jellemzői:

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;

Trigger törlése

DROP TRIGGER trigger_nev;

Ez a parancs eltávolítja a megadott triggert az adatbázisból.

Trigger módosítása

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.

Mikor célszerű triggert használni?

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

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

  3. Üzletszabályok Kényszerítése: Ha bizonyos üzleti logikát vagy szabályokat ki szeretnénk kényszeríteni az adatokon keresztül.

  4. 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ök

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ányok

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.

Összefoglalva

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.


Példa trigger használatára

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.

1. Táblák létrehozása

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

2. Trigger Létrehozása

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 ;

3. Példa a trigger használatára

INSERT INTO diakok (nev, eletkor) VALUES ('Kis Piroska', 21);
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

Feladatok:

I. feladat

  1. Hozz létre egy MySQL trigger-t, amely automatikusan rögzíti a "diakok" táblába beszúrt új jegyeket a "logs" táblában. A feladathoz szükséges táblák:
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 );
  1. 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.

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

  1. Tegyük fel, hogy van egy 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 );
  1. 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.

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

III. feladat

Hozzunk létre egy tasks táblát, amely tartalmazza a feladatok nevét, státuszát, valamint a befejezés dátumát és emellett egy status_history táblát is hozzunk létre, amely nyomon követi a feladat státuszának változásait. Hozzunk létre egy triggert amelyben naplózzuk a task_status változásait (task_id, new_status, old_status), valamint frissíti a befejezés dátumát, ha a státusz "completed"-re változik,

CREATE TABLE tasks ( id INT AUTO_INCREMENT PRIMARY KEY, task_name VARCHAR(255) NOT NULL, task_status VARCHAR(50) NOT NULL, completed_date DATETIME DEFAULT NULL ); CREATE TABLE status_history ( id INT AUTO_INCREMENT PRIMARY KEY, task_id INT, old_status VARCHAR(50), new_status VARCHAR(50), change_date DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (task_id) REFERENCES tasks(id) );

IV. feladat:

Hozzuk létre az employees és salary_updates táblákat!

-- Munkavállalók tábla CREATE TABLE employees ( id INT AUTO_INCREMENT PRIMARY KEY, -- Munkavállaló egyedi azonosítója name VARCHAR(255) NOT NULL, -- Munkavállaló neve current_salary INT NOT NULL, -- Aktuális fizetés rank INT NOT NULL DEFAULT 1 -- Lépcsőfok, alapértelmezett: 1 ); -- Fizetésfrissítések tábla CREATE TABLE salary_updates ( id INT AUTO_INCREMENT PRIMARY KEY, -- Fizetésfrissítés egyedi azonosítója employee_id INT, -- A frissített munkavállaló azonosítója new_salary INT NOT NULL, -- Az új fizetés FOREIGN KEY (employee_id) REFERENCES employees(id) -- Kapcsolat az employees táblával );

Készítsünk egy trigger-t amely frissíti a munkavállalók lépcsőfokát a fizetésük alapján.

Az új lépcsőfokot (rank) az alábbi feltételek alapján állítsuk be:

A triggerben ellenőrizzük. hogy a munkavállaló létezik-e, ha nem létezik, akkor hozzuk létre!



Forrás:
https://it-sziget.hu/triggerek-hasznalata-mysql-ben
https://www.w3seo.hu/mysql-alapok-triggerek/
AI