Delphi - Triggerek gyakorlati használata MS SQL-ben

forráskód letöltése
Ebben a példában az MS SQL-ben használható Triggerek gyakorlati alkalmazására mutatunk be egy egyszerű példát. A példában két táblát használunk, melyek egy a többhöz kapcsolatban állnak. A Master tábla egyik mezőjében nyilvántartjuk, hogy ahhoz a rekordhoz hány Detail rekord tartozik. Amikor a Detail táblában létrehozunk, vagy törlünk egy rekordot, akkor a Master tábla megfelelő rekordjában ez a szám automatikusan változik anélkül, hogy programból kellene azt frissíteni. A példaprogram futtatása előtt az adatbázist létre kell hozni, amihez használja a mellékelt testdb.sql fájlt. Az új adatbázis neve TestDB lesz. Arra figyeljen, hogy ha már létezik ilyen néven adatbázis, akkor az SQL fájl futtatása után az felül lesz írva. Az SQL fájl CREATE DATABASE sorában az elérési útvonalakat a helyi paramétereknek megfelelően állítsa be, illetve adjon meg egy olyan elérési útvonalat, ahová az új adatbázist létre szeretné hozni. Ha módosította a fájlt, akkor mentse el, majd indítsa el a Query Analyzer programot. Ezt megteheti a Start menüből, vagy az Enterprise Manager Tools menüjének SQL Query Analyzer menüpontjával. Ha még nem tettük volna meg, akkor csatlakozzunk ahhoz az adatbázis szerverhez a File menü Connect menüpontjával. Ezután nyissuk meg a testdb.sql fájlt a File menü Open menüpontjával, majd a Query menü Execute menüpontjával futtassa le azt (F5).
A futtatás után létrejön a TestDB adatbázis, benne két táblával, továbbá a TableMaster táblában három rekord.
Ha a fenti műveletekkel megvagyunk, akkor indíthatjuk a példaprogramot.
Amikor a Detail táblában új rekordot hozunk létre, akkor a Master tábla DetailCount mezőjének értéke eggyel nő, amikor törlünk, akkor pedig csökken. Ha megnézzük a példaprogram forrását, akkor láthatjuk, hogy ezt nem programból oldottuk meg.
A megoldás a Triggerek használata. Az Enterprise manager-ben nyissuk meg a TestDB adatbázist, és keressük meg a TableDetail táblát. Kattintsunk jobb gombbal a tábla nevén, majd a megjelenő menüből válasszuk ki az „Összes feladat / Manage triggers …” menüpontot.
A megjelenő ablakban tudunk új Triggereket létrehozni, vagy a már meglévőket módosítani, illetve törölni. A fenti feladat megoldásához két Triggert hozunk létre. Az első akkor fut le, amikor a táblában létrejön egy új rekord. Ez a Trigger így néz
CREATE TRIGGER [DETAIL_ADD] ON [dbo].[TableDetail]
FOR INSERT
AS
UPDATE TableMaster
SET TableMaster.DetailCount=TableMaster.DetailCount+1
FROM Inserted
WHERE TableMaster.ID = Inserted.ID
A DETAIL_ADD a Trigger neve. A FOR kulcsszó után három további kulcsszót lehet megadni: INSERT, UPDATE, DELETE. Ebben a Triggerben csak az INSERT-et használjuk, mivel ennek csak új rekord létrehozásakor kell lefutnia.
Az AS kulcsszó után jön az SQL script, amit le szeretnénk futtatni. Ez jelen esetben a TableMaster tábla DetailCont értékéhez ad hozzá 1-et. A script-ben egy Inserted táblára hivatkozunk, ami a TableDetail egy másolata, és jelen esetben az új rekordot tartalmazza.

A másik Trigger amit létrehozunk, formáját tekintve szinte teljesen megegyezik az előzővel. A különbség csupán annyi, hogy itt a DELETE eseményt adjuk meg, a DetailCount mező értékét nem növeljük, hanem csökkentjük, és a Deleted táblára hivatkozunk benne. A Deleted tábla a törölt rekordok másolatait tartalmazza.
CREATE TRIGGER [DETAIL_REMOVE] ON [dbo].[TableDetail]
FOR DELETE
AS
UPDATE TableMaster
SET TableMaster.DetailCount=TableMaster.DetailCount-1
FROM Deleted
WHERE TableMaster.ID = Deleted.ID