WinBase602 - TRIGGERY - popis a pou₧itφ Home page | Seznam Tip∙ t²dne | Produkty | Download | Cenφk
WinBase602 - TRIGGERY - popis a pou₧itφ

Trigger je nßstroj, kter² zajiÜ¥uje automatickΘ provedenφ programu v jazyce SQL p°i vlo₧enφ, zruÜenφ nebo zm∞n∞ zßznamu v urΦitΘ tabulce.

Trigger m∙₧e nap°φklad zajistit, ₧e:
  • p°ed vlo₧enφm novΘho zßznamu do tabulky bude provedena kontrola jeho obsahu a dopln∞ny hodnoty n∞kter²ch sloupc∙;
  • po smazßnφ zßznamu se provedou nßslednΘ akce;
  • p°i zm∞n∞ hodnoty urΦitΘho sloupce v zßznamu se porovnß starß a novß hodnota a na zßklad∞ jejich vztahu se provedou dalÜφ akce.

    Triggery zjednoduÜujφ tvorbu aplikacφ, proto₧e p°enßÜejφ Φßst prßce databßzovΘ aplikace na server. Umo₧≥ujφ centralizovanΘ definovßnφ pravidel platn²ch pro informaΦnφ systΘm. Existuje-li nap°φklad v podnikovΘm informaΦnφm systΘmu tabulka zam∞stnanc∙, lze pomocφ trigger∙ popsat, jakΘ vÜechny akce musφ b²t provedeny p°i p°ijetφ nebo propuÜt∞nφ zam∞stnance, zm∞n∞ platu nebo p°e°azenφ do jinΘho odd∞lenφ. Tyto akce se naprogramujφ na jednom mφst∞, ale budou slou₧it vÜem aplikacφm, kterΘ manipulujφ s tabulkou zam∞stnanc∙. Dodr₧enφ pravidel pro ·dr₧bu evidence zam∞stnanc∙ pak bude zajiÜ¥ovat server automaticky a konzistence dat bude zajiÜt∞na bez ohledu na mo₧nΘ chyby v m∞nφcφch se aplikacφch.

    Trigger je pojmenovan²m objektem pat°φcφm do databßzovΘ aplikace. Mß tyto vlastnosti:
  • je svßzßn s urΦitou tabulkou a reaguje na zm∞ny v tΘto tabulce;
  • reaguje na prßv∞ jednu z SQL akcφ INSERT, DELETE nebo UPDATE, triggery reagujφcφ na UPDATE mohou navφc specifikovat mno₧inu sloupc∙, jejich₧ souΦasnß zm∞na (vÜech vyjmenovan²ch) je spouÜtφ; trigger se spouÜtφ takΘ provßd∞nφm obdobn²ch akcφ p°i prßci s pohledy;
  • provßdφ se bu∩ p°ed (BEFORE) provedenφm v²Üe specifikovanΘ akce, nebo po nφ (AFTER); pro triggery spouÜt∞nΘ jinak ne₧ SQL p°φkazem (prßce s pohledy) platφ tato v²jimka: trigger spuÜt∞n² p°i vlo₧enφ zßznamu (INSERT) m∙₧e b²t pouze AFTER (m∙₧e nap°. zapsat hodnoty do vlo₧enΘho zßznamu);
    trigger nelze vyvolat editacφ hodnot multiatributu;
  • m∙₧e obsahovat podmφnku, kterß se vyhodnotφ p°ed provedenφm triggeru a pokud nenφ spln∞na, trigger nebude spuÜt∞n;
  • specifikuje akci (zapsanou v jazyce pro tvorbu rutin - PSM), kterß bude automaticky provedena, jakmile jsou spln∞ny podmφnky pro spuÜt∞nφ triggeru.

    P°i provedenφ konkrΘtnφ akce mohou b²t spln∞ny podmφnky pro spuÜt∞nφ vφce ne₧ jednoho triggeru. V takovΘm p°φpad∞ jsou spuÜt∞ny po °ad∞ vÜechny. V souΦasnΘ podobn∞ nßvrhu normy SQL 3 nenφ zahrnut zp∙sob, jak by u₧ivatel v textu trigger∙ mohl definovat po°adφ jejich spouÜt∞nφ. Je pravd∞podobnΘ, ₧e p°ed definitivnφ redakcφ normy bude tento zp∙sob specifikovßn a potΘ bude p°idßn i do WinBase.

    Provßd∞nφ trigger∙ m∙₧e m∞nit obsah databßze a tφm spouÜt∞t dalÜφ triggery. SpouÜt∞nφ trigger∙ se m∙₧e do sebe libovoln∞ zano°ovat.

    Pokud p°φkaz, kter² spustil trigger, je odvolßn (kv∙li chyb∞ nebo v d∙sledku provedenφ p°φkazu ROLLBACK), pak takΘ vÜechny akce, kterΘ v databßzi trigger provedl, budou odvolßny. Je-li trigger spuÜt∞n v transakci, pak se provßdφ jako souΦßst tΘto transakce. Chyba, kterß nastane p°i provßd∞nφ triggeru, mß stejnΘ d∙sledky, jako chyba v p°φkazu, kter² trigger spustil. Uvnit° trigger∙ se nesmφ provßd∞t transakΦnφ p°φkazy COMMIT ani ROLLBACK, v opaΦnΘm p°φpad∞ nastane chybov² sqlstate 2D000.

    P°i provßd∞nφ trigger∙ se nekontrolujφ prßva. Aby dφky tomu nemohlo dojφt k neoprßvn∞nΘmu zßpisu, m∙₧e triggery vytvß°et pouze sprßvce databßze resp. sprßvce aplikace.
    INSERT a UPDATE triggery se nespout∞jφ p°i importu dat do tabulky. DELETE triggery se nespouÜt∞jφ p°i smazßnφ tabulky jako objektu (p°i mazßnφ zßznam∙ samoz°ejm∞ ano).


    Efektivita trigger∙
    Provedenφ akcφ pomocφ triggeru reagujφcφho na p°φkaz SQL je zpravidla efektivn∞jÜφ ne₧ explicitnφ volßnφ stejn²ch akcφ klientem. NicmΘn∞ váefektivit∞ provßd∞nφ trigger∙ existujφ rozdφly:
  • Nejefektivn∞jÜφ jsou triggery AFTER INSERT a BEFORE DELETE. Jejich provedenφ neznamenß pro server prakticky ₧ßdnou dodateΦnou zßt∞₧.
  • Dosti efektivnφ jsou takΘ triggery AFTER DELETE a AFTER UPDATE. Jejich provedenφ vy₧aduje pouze vykopφrovßnφ urΦit²ch °ßdk∙ zádatabßze do transientnφch prom∞nn²ch.
  • Triggery BEFORE INSERT a BEFORE UPDATE pon∞kud sni₧ujφ rychlost provßd∞nφ operacφ, proto₧e nutφ server, aby kv∙li vytvo°enφ sprßvn²ch transientnφch prom∞nn²ch provßd∞l operaci INSERT resp. UPDATE mΘn∞ efektivnφm zp∙sobem.

    Vá°ad∞ situacφ nehraje roli, zda se pou₧ije BEFORE nebo AFTER trigger. Pak lze vyu₧φt v²Üe uveden²ch °ßdek kázefektivn∞nφ prßce serveru.


    P°φklady trigger∙

    1. Po vlo₧enφ zßznamu se do sloupc∙, kterΘ nebyly vypln∞ny, dosadφ implicitnφ hodnoty.

    TRIGGER jedna AFTER INSERT ON Tab2
    REFERENCING NEW  ROW AS novaradka
    FOR EACH ROW
    BEGIN
      SET novaradka.cisint=-99;
      SET novaradka.retez2="AHOJ";
    END
    

    2. Po p°epsßnφ sloupce dat1 v tabulce DatTab se do sloupce kolikdni zapise rozdil mezi starou a novou hodnotou.

    TRIGGER DatTabControlUpd AFTER UPDATE OF dat1 ON DatTab
    REFERENCING NEW AS novarad
                OLD AS stararad
    FOR EACH ROW
    BEGIN
      SET novarad.kolikdni=CAST(Abs(novarad.dat1-stararad.dat1) AS INT);
    END
    

    3. Trigger, kter² zajistφ zapsßnφ absolutnφ hodnoty Φφsla.

    TRIGGER befupd BEFORE UPDATE OF CISINT ON Tab2
    REFERENCING NEW ROW AS novaradka
    FOR EACH ROW
    BEGIN
      IF novaradka.cisint < 0 THEN
        SET novaradka.cisint=-novaradka.cisint;
      END IF;
    END
    

    Home page | Seznam Tip∙ t²dne | Produkty | Download | Cenφk