Készítette: Sárközi Anikó Triggerek Készítette: Sárközi Anikó
Triggerek Tárolt eljárások amelynek lefutását egy esemény váltja ki, pl. egy új rekord beszúrása… Lehetőségünk van például olyan logikai hibák megakadályozására, amelyeket egy egyszerü CHECK paranccsal nem lehetne megakadályozni. Egy le nem írt konvenció szerint úgy illik elnevezni a triggereket, hogy a nevükben látható legyen valamilyen formában a táblázat és a parancsok, amikhez a triggert létrehozták Példa… Create database teszt_db use teszt_db CREATE TRIGGER ins_trigger ON tabla1 INSTEAD OF INSERT AS BEGIN IF ((SELECT id FROM inserted)>10) INSERT INTO tabla1 (id, nev) VALUES (SELECT id, nev FROM inserted) END Ez a trigger csak abban az esetben engedi beillszteni az új sort, ha az "id" > 10.
Mi is az a CHECK? „Korlátozás” korlátozza azt az értéktartományt amit egy mezőbe lehet írni Egy mező értékét korlátozhatjuk egy logikai kifejezés értékével, a logikai kifejezésben más mezők értékeit is szerepeltethetjük WARNING: a Mysql-ben nincs…!!!!!van..de mégsincs…
Példák CHECK használatára CREATE TABLE Persons ( Kor int NOT NULL, Nev varchar(255) NOT NULL, CHECK (Kor>200) ) Utólagos hozzáadás: ALTER TABLE Persons ADD CHECK (Kor>200)
Triggerek fajtái Események típusa szerint: DML trigger(Data Manipulation Language), DDL trigger(Data Definition Language), Logon trigger.
DML triggerek Táblákon vagy nézeteken hajtódik végre Akkor aktiválódik ha valamilyen DML esemény történik DML Események: INSERT, UPDATE, DELETE Módok: BEFORE (INSTEAD OF) AFTER Feladat amit a check-kel nem lehet megcsinálni Pl:film-életkorkorlátozás
Before trigger Mindhárom esemény esetén (INSERT, UPDATE, DELETE) a parancs előtt hajtódik végre. Lehetőségünk van, saját hiba generálásával megakadályozni a művelet végrehajtódását Példát keresni
After trigger A trigger egy INSERT, UPDATE vagy DELETE parancs futtatása után (amikor az adatok már módosultak) hajtódik végre. Ha a triggerben a tranzakciót visszavonjuk, akkor az adatokat az adatbáziskezelő törli.(rollback) Ha a triggerben mindent rendben találunk, akkor a módosításokat elfogadjuk
DML Trigger korlátozások Egy táblához legfeljebb 3 trigger készíthető(INSERT, UPDATE, DELETE), Parancsonként legfeljebb egy, vagyis egy parancshoz vagy AFTER vagy BEFORE Egy triggert több parancshoz is köthetünk pl: INSERT-UPDATE parancsoknál történő ellenőrzések megegyeznek
Triggerek szintaxisa T-SQL(Transact-SQL): Microsoft SQL megvalósítása Programozási szerkezetekkel egészíti ki a nyelvet Segítségével olyan sql-t tartalmazó programokat írhatunk,amelyekben a szokványos programozási szerkezetek is megtalálhatók (változók, feltételes szerkezetek, ciklusok, eljárások-függvények) Pl:Microsoft SQL Server 2000, 2005
T-SQL szintaxis: CREATE TRIGGER <trigger_név> ON <táblázat_neve> { BEFORE | AFTER } <sql_parancs_típus> AS <T-SQL_parancs> <trigger_név> : … <táblázat_neve> : annak a táblázatnak a neve amelyre az adatbanknak alkalmaznia kell a triggert <sql_parancs_típus> : INSERT | UPDATE | DELETE <T-SQL_parancs> : egy parancs vagy blokk amit a trigger a meghívásakor végrehajt
Példa(AFTER) CREATE TRIGGER ins_upd_Beszallito ON Beszallito AFTER INSERT, UPDATE AS BEGIN IF UPDATE(BeszallitoID) ROLLBACK TRANSACTION END Magyarázat: Létrehozunk egy triggert, aminek a neve "ins_upd_Beszallito" lesz. (Egy le nem írt konvenció szerint úgy illik elnevezni a triggereket, hogy a nevükben látható legyen valamilyen formában a táblázat és a parancsok, amikhez a triggert létrehozták) Jelen esetben a trigger neve utalást ad arra, hogy a trigger a "Beszallito" nevü táblának INSERT illetve UPDATE paranccsal történő módosításakor lesz meghívva. Ezekre a dolgokra a következö sorok adnak utasítást. Az "ON" kulcsszó mögött áll annak a táblának a neve, amelyiket ez a trigger felügyeli. Az "AFTER" kulcsszó es az az utáni "INSERT, UPDATE" kulcsszavak jelzik, hogy a trigger minden olyan INSERT és UPDATE parancs után lesz meghívva, amelyek a fent nevezett táblát módosítják. Az "AS" utáni blokkban lekérdezhető, hogy a BeszallitoID nevű oszlopot (feltételezzük, hogy ez jelen esetben primary key) módosították-e. Ha igen, akkor a tranzakciót a ROLLBACK TRANSACTION paranccsal visszavonjuk, mivel a primary key oszlopai nem módosulhatnak.
Új, módosított vagy törölt adatok lekérdezése A triggerekben (triggertől függően) létezik két speciális tábla. A felépítésük megegyezik az INSERT, UPDATE vagy DELETE parancs cél-táblájának felépítésével. MS SQL Servernél: „inserted”:Ebben a táblában csak az új (beillesztett vagy beillesztendő) adatok szerepelnek. „deleted”:Ebben a táblában csak a régi (törölt vagy törlendő) adatok szerepelnek. Egy INSERT parancs esetében csak az "inserted" táblázat, míg az UPDATE parancsnál mindkettő létezik. A DELETE parancsnál már csak a "deleted" táblázat létezik. ???Fontos: SQL engedélyezi, hogy egy parancs alkalmával több sor legyen módosítva. (Pl. INSERT INTO (SELECT * FROM …);, vagy DELETE FROM xyz;) A triggerben erre is gondolni kell és ha egyszerü SQL-kéréssel nem lehet ellenörizni a müvelet helyességét, akkor azt ún "cursor"-al kell megtenni.???
Egy INSERT parancs esetében csak az "inserted" táblázat, míg az UPDATE parancsnál mindkettő létezik. A DELETE parancsnál már csak a "deleted" táblázat létezik. Mysql-es pl: NEW.nev,NEW.tel, OLD.nev,OLD.tel,
Triggerek szintaxisa PL/SQL : Az Oracle által kifejlesztett programozási nyelv Oracle adatbáziskezelőt használva ezen a nyelven írhatunk triggereket és más tárolt eljárásokat. A nyelv alapja az Ada programozási nyelv(strukturált, típusos, blokkszerkezetes, imperatív p.ny.) magában foglalja az SQL nyelvet(SELECT, INSERT, DELETE, UPDATE illetve OPEN, FETCH, CLOSE utasításait )
CREATE [OR REPLACE] TRIGGER <trigger_name> PL/SQL: CREATE [OR REPLACE] TRIGGER <trigger_name> {BEFORE|AFTER} {INSERT|DELETE|UPDATE} ON <table_name> [REFERENCING [NEW AS <new_row_name>] [[OLD AS <old_row_name>]] [FOR EACH ROW [WHEN (<trigger_condition>)]] <trigger_body> <new_row_name> : a táblázat neve, amelyben az új adatok szerepelnek (default: ":NEW") <old_row_name> : a táblázat neve, amelyben a régi adatok szerepelnek (default: ":OLD") <trigger_condition> : egy feltétel, amely fennállása a trigger meghívásához vezet. Más esetben a trigger nem lesz meghívva. <trigger_body> : egy PL/SQL parancs vagy blokk, amelyben a trigger programkódja van.
REFERENCING: nem kötelező megadni REFERENCING: nem kötelező megadni. Ilyen esetben a fent nevezett default értékek lesznek véve. FOR EACH ROW: a PL/SQL előnye T-SQL-el szemben, hogy ennek a paraméternek a megadásával a szerver kényszerítve lesz, hogy a trigger például egy INSERT INTO (SELECT * FROM …); parancs minden sorára egyenként hívja meg. Ha a FOR EACH ROW-t nem írjuk oda, a trigger parancsonként lesz meghívva. A PL/SQL ilyenkor ugyan úgy fog viselkedni, mint a T-SQL.
DLL triggerek Olyan mint a hagyományos triggerek Rövid tárolású események amik egy eljárás bekövetkeztére jönnek létre Ezek az események elsősorban tranzakciós sql parancsokra reagálnak(CREATE, ALTER, DROP) Bizonyos rendszer tárolású események amik kezelnek DDL szerű műveleteket szintén indíthatnak DDL triggereket. Csak az őket kiváltó DDL állapot befejezte után futnak le. A DDL triggereket nem lehet INSTED OF triggerként használni
DDL triggerek Felhasználás: Adminisztráció feladatok:auditálás,adatbázis-sémák szabályozása adatbázis-sémák bizonyos változtatásainak megakadályozása Azt akarod valamitől, hogy történjen az adatbázisban egy az adatbázis-sémádban bekövetkező változásra adott válaszban. Változásokat vagy eseményeket akarsz felvenni az adatbázis-sémában.
DDL triggerek Példa:hogy lehet megakadályozni DDL triggerrel, hogy módosítsák vagy eldobják a táblánk, vagy adatbázisunk? CREATE TRIGGER biztonsági ON DATABASE FOR DROP_TABLE, ALTER_TABLE AS PRINT ‘Kapcsold ki a „biztonsági" triggert, hogy tudd eldobni és módosítani a táblát ROLLBACK ;
Köszönöm a figyelmet!