létrehozása kiváltó
A szerepe kiváltó (lásd. 14. lecke) nem korlátozódik a végrehajtása az üzleti szabályok az adatbázis szerver. Ezeket be lehet állítani, hogy automatikusan növekszik mező értéke kapott a generátor. Hozzon létre egy aktiválási:
CREATE TRIGGER BEF_INS_NAKLS FOR Nakls
Előtt aktív INSERT
NEW.NakllD = GEN_ID (GEN_NAKLS, 1); VÉGE
Az első sor mellett a nevét BEF_INS_NAKLS ravaszt (bár kiváltó nem címzett felhívás őket név szerint a tárolt eljárás vagy az SQL-lekérdezések, úgy, mint minden más szervezetek Server adatbázis egyedi névvel kell rendelkezniük) is rámutat asztal Nakls, amelyre azt szánták. A következő sor azt jelzi, hogy a ravaszt kell aktiválni (a mi esetünkben - beszúrni egy új rekord). A harmadik sorban a AS kulcsszó, amely megnyitja a test a ravaszt. A trigger test mindig (akkor is, ha a ravaszt tartalmaz egyetlen szolgáltató, mint ebben az esetben) kell korlátozni egy pár BEGIN és az END kulcsszavak. Az ötödik sorban egyetlen végrehajtható utasítás, amely az új értéket (állítmány NEW) NakllD területen kap értéket kapott a belső GEN_ID funkciót. Két paraméterek a függvény generátor jelzett nevét és értékét, amelyekre meg kell növelni a jelenlegi értékét a generátor ( „lépés” a generátor). Figyeljük meg, hogy az INSERT és UPDATE kiváltó utalhat az új mező értéke, ha a neve előtt egy állítmány ÚJ, és DELETE és UPDATE kiváltó - a régi érték (OLD állítmány).
FIGYELEM kezdeményez auto-növekmény mező segítségével generátorok csak trigonometrikus-gerah kiváltott behelyezése előtt egy új rekordot.
Hasonlóképpen VEG_SH5_G1KM8 létre kiváltja VEG__SH8_MOUEVOOK, VEG_1Y5_VOOK5, VER_1Y8_RAUMEYT8 autoincrement más területeken.
Természetesen a segítségével kiváltó kell végrehajtani a legtöbb üzleti szabályokat. Mi csak azokat intézkedéseket, amelyeket meg kell tenni, ha adatokat töröl a szállítólevél és amikor kiveszi könyveket a könyvek listáját kapcsolatos számlát. Adatai az összes kapcsolódó könyv el kell távolítani, mielőtt eltávolítja az adatokat a számlát. Ez történik, mint egy egyszerű kapcsoló:
CREATE TRIGGER BEFORE_DEL_NAKLS FOR NAKLS
AKTÍV törlés előtt AS
DELETE FROM MoveBook WHERE MNakl = NakllD; VÉGE
Az adatok törlésével egy külön könyvet jár egy bonyolultabb cselekvési logika: alapján a típusú számlát kell beállítani, a példányszámot, a könyv szerinti készlet és az egyensúlyt a partnere, valamint módosíthatja a számla összege:
CREATE TRIGGER BEFORE_DEL_MOVEBOOK FOR MOVEBOOK
AKTÍV törlés előtt
/ * Tedd a számla típusa változó TypeN partner titkosító változó FirmN és együttható Coeff * /
SELECT NType, NFirm FROM Nakls
INTO: TypeN. FirmN;
IF (: TypeN IN (0,3,4 / 6)) THEN
/ * Törli a könyv a törvényjavaslat kapcsolódó érkezése könyveket. Csökkentse a könyvek száma raktáron * / UPDATE Books
SET BQuan = BQuan-OLD.MQuan AHOL BookID = OLD.MBook; / * Állítsa be az egyensúlyt a partner * / IF (: TypeN = 4), akkor / * Növeli a csere egyensúly * / UPDATE cégek
SET FChgDelta = FChgDelta + OLD.MQuan * OLD.MPrice *: Coeff WHERE FirmID =: FirmN; ELSE
/ * Növeli a pénzügyi egyensúly * / UPDATE cégek
SET FFinDelta = FFinDelta + OLD.MQuan * OLD.MPrice *: Coeff WHERE FirmID =: FirmN; END ELSE BEGIN
/ * Törli a könyv a számlát az érintett ellátásához kapcsolódó könyvek. Növekszik a könyvek száma raktáron * / UPDATE Books
AHOL BookID = OLD.MBook; IF (: TypeN = 4), akkor / * csökkenő csere egyensúly * / UPDATE cégek
SET FChgDelta = FChgDelta + OLD.MQuan * OLD.MPrice *. Coef F ahol FirmID =: FirmN; ELSE
/ * Csökkenti a pénzügyi egyensúly * / UPDATE cégek
SET FFinDelta = FFinDelta + OLD.MQuan * OLD.MPrice *: Coeff WHERE FirmID =: FirmN;
SET nsum = nsum-OLD, MQuan * OLD.MPrice *: Coeff WHERE NaklID = OLD.MNakl;
Ha ez megtörtént, a ravaszt fog megbirkózni a feladattal, hogy eltávolítja az adatokat a számla könyv, hanem egy kísérlet arra, hogy törölje az összes információt a számla nem lesz lehetséges, mivel a kiváltó próbál változtatni a területen a törölt számlát. Hogyan lehet megoldani ezt a problémát? A tény az, hogy ellentétben kiváltó eljárások nem telt el, ami azt jelzi, hogy a törölt adatok a számlán egészére. Miután megkapta egy ilyen környezetben, a ravaszt egyszerűen nem változtatna a számla összege, és a korrekció az egyensúly a partner lehet ebben az esetben, hogy a BEF_DEL_NAKLS kiváltó egyszer a teljes összeget, és hogy nem erre minden egyes könyv. Azonban, ismétlem, a ravaszt nem tudja átadni a paraméter, és nincs globális változókat az adatbázis. Amikor először találkozott ezzel a problémával a gyakorlatban, úgy tűnt, nem oldódik. Azonban némi habozás után azt találtam, azt hiszem, ez egy elfogadható megoldás. Azt a táblázatba MOVEBOOK új mező:
ALTER TABLE MOVEBOOK ADD IsDelNakl VARCHAR (1)
Ez a mező a folyamat értékének megadása a ravaszt F BEF_INS_MOVEBOOK:
CREATE TRIGGER BEF_INS_MOVEBOOK FOR MOVEBOOK ELŐTT INSERT AS BEGIN
NEW.MovelD = GEN_ID (GEN_MOVEBOOK, 1); VÉGE
Trigger BEF_DEL_NAKL először végrehajtja a következő nyilatkozatot teszi:
UPDATE MoveBook SET IsDelNakl = "T" AHOL MNakl = OLD.NakllD;
Most BEF_DEL_MOVEBOOK ravaszt lehet elemezni a mezőt és a korrekció blokk a számla összegét, ha a T mező tartalmazza:
IF (OLD.IsDelNakl O "T"), majd frissítés Nakls
SET nsum = nsum-OLD.MQuan * OLD.MPrice *: Coeff WHERE NaklID = OLD.MNakl;
Helyes szövegek triggerek látható használatával SQL Explorer. Ehhez nyissa meg a csomópont melletti asztalt, majd bontsa triggerek csomópontot, válassza ki a nevet a ravaszt, és kattintson a Szöveg lapra.