1 Syntaxe a sémantika aktivních databází Databázové triggery Aktivní pravidla 10. listopadu 2004 Zuzana Reitermanová & Vojtěch Hlaveš
2 Obsah Historie a standardizace triggerů Aktivní pravidla v databázi Starburst Definice Příklady Triggery v databázi Oracle Vylepšení oproti Starburstu Problém se zanořováním triggerů Shrnutí
3 Co je to trigger a jeho vývoj… Trigger („spoušť“) je “procedura”, která se spustí při výskytu nějaké sledované události. V relačních databázích trigger = aktivní pravidlo Konec 80. let první snahy o formální definici SQL92 triggery neobsahuje nedostatky ve standardizačních dokumentech SQL1999 triggery již obsahuje
4 Starburst IBM, Almaden Research Center Starburst Active Rule System Získalo popularitu Jednoduchá syntaxe a sémantika Množinově orientovaná Pravidla založena na ECA-paradigmatu (Event-Condition-Action)
5 ECA-paradigma Událost (Event) SQL-příkazy pro manipulaci s daty (INSERT, DELETE, UPDATE) Podmínka (Condition) booleovský predikát nad stavem databáze, vyjádřen pomocí SQL Akce (Action) provádí libovolné SQL dotazy (například SELECT, INSERT, DELETE, UPDATE) navíc mohou obsahovat příkazy pro manipulaci s aktivními pravidly a transakční instrukci ROLLBACK WORK
6 Sémantika aktivních pravidel Jednoduchá a intuitivní Když nastane Událost, pokud je splněna Podmínka, proveď Akci. Říkáme, že pravidlo je: spuštěno (triggered) – pokud nastane příslušná Událost vyhodnoceno (considered) – po vyhodnocení dané Podmínky vykonáno (executed) – po provedení jeho Akce
7 Vlastnosti aktivních pravidel (triggerů) Jsou přidané do schématu databáze a jsou sdílené všemi aplikacemi. Mohou být dynamicky aktivovány a deaktivovány každou transakcí. Mohou tvořit skupiny. Každé pravidlo ve Starburstu má jedinečné jméno a je spojeno s jednou určitou tabulkou, zvanou rule’s target. Každé aktivní pravidlo může sledovat více Událostí, tzv. rule’s triggering operations. Jeden SQL příkaz může být sledován více pravidly. Pořadí pravidel je určeno na základě jejich částečného uspořádání.
8 Syntaxe příkazu CREATE RULE ::= CREATE RULE ON WHEN [ IF ] THEN [ PRECEDES ] [ FOLLOWS ] ::= INSERTED | DELETED | UPDATED [( )]
9 Příklad I. – vytvoření aktivního pravidla Řízení platu zaměstnanců: CREATE RULE RegulacePlatu ON Zaměstnanci WHEN INSERTED, DELETED, UPDATED (Plat) IF (SELECT AVG(Plat) FROM Zaměstnanci) > 100 THEN UPDATE Zaměstnanci SET Plat = 0.9 * Plat Pravidlo sleduje přijímání a propouštění zaměstnanců a změnu jejich platů. Kdykoli průměrný plat překročí daný práh (100), sníží platy všem zaměstnancům (na 90%).
10 Sémantika aktivních pravidel Aktivní pravidla jsou ve Starburstu zpracovávány v souvislosti s danou transakcí. Zpracování pravidel může být vyvoláno implicitně, když transakce vydá příkaz COMMIT WORK. To vede k odloženému vykonání explicitně příkazem PROCESS RULES.
11 Stavy aktivních pravidel Nespuštěno (untriggered) Při zahájení transakce Spuštěno (triggered) Když nastane jeho spouštějící událost Spuštěná aktivní pravidla v daný časový okamžik tvoří konfliktní množinu.
12 Algoritmus zpracování aktivních pravidel WHILE konfliktní množina ≠ Ø DO 1. Vyber jedno pravidlo P z konfliktní množiny z aktivních pravidel s nejvyšší prioritou; změň stav P na „nespuštěno“. 2. Vyhodnoť podmínku pravidla P. 3. Pokud je podmínka P splněna, proveď akci pravidla P.
13 Další příkazy pro práci s aktivními pravidly ::= DEACTIVATE RULE ON ::= ACTIVATE RULE ON ::= DROP RULE ON ::= PROCESS RULES | PROCES RULESET | PROCES RULE
14 Příkazy pro práci s množinami pravidel ::= CREATE RULESET ::= ALTER RULESET [ ADDRULES ] [ DELRULES ] ::= DROP RULESET
15 Příklad I. – pokračování CREATE RULE RegulacePlatu ON Zaměstnanci WHEN INSERTED, DELETED, UPDATED (Plat) IF (SELECT AVG(Plat) FROM Zaměstnanci) > 100 THEN UPDATE Zaměstnanci SET Plat = 0.9 * Plat Průměrný plat zaměstnance je 97. Uvažujme transakci, která přidá záznamy Vložení spustí pravidlo Regulace platu. Nový průměrný plat je 112 podmínka je splněna provede se akce ZaměstnanecPlat Božena90 Jan90 Josef110 Bořivoj150 Oldřich120
16 Příklad I. – pokračování Nový stav databáze po provedení pravidla: Operace UPDATE v akci pravidla způsobí, že se pravidlo spustí znovu. Průměrný plat je nyní 101 podmínka je splněna provede se akce Nový stav databáze: ZaměstnanecPlat Božena81 Jan81 Josef99 Bořivoj135 Oldřich108 ZaměstnanecPlat Božena73 Jan73 Josef89 Bořivoj121 Oldřich97
17 Příklad I. – dokončení Pravidlo je opět spuštěno díky operaci UPDATE. Pravidlo je vyhodnoceno, ale již se neprovede Průměrný plat je teď 91. Algoritmus provádění aktivních pravidel končí. Nebezpečí „zacyklení“ v případě špatně definovaných pravidel.
18 Příklad II. Uvažujme databázi jako na začátku Příkladu I. K databázi přidáme nové aktivní pravidlo VysocePlacení, Pravidlo vkládá do pohledu VysocePlaceníZaměstnanci (VPZ) ty nově přidané zaměstnance, kteří mají plat vyšší než 100. CREATE RULE VysocePlacení ON Zaměstnanci WHEN INSERTED IF EXISTS (SELECT * FROM INSERTED WHERE Plat > 100) THEN INSERT INTO VPZ (SELECT * FROM INSERTED WHERE Plat > 100) FOLLOWS RegulacePlatu
19 Příklad II. - pokračování Uvažujme nyní znovu přidání Bořivoje a Oldřicha do databáze. Operace INSERT spustí obě pravidla. Algoritmus zpracovávání pravidel vybere nejprve pravidlo RegulacePlatu. Pravidlo RegulacePlatu se provede díky rekurzi dvakrát. ZaměstnanecPlat Božena90 Jan90 Josef110 Bořivoj150 Oldřich120
20 Příklad II. – dokončení Tabulka Zaměstnanci se dostane do stavu jako v Příkladě I. Nyní je pravidlo RegulacePlatu „nespuštěno“ a pravidlo VysocePlacení je „spuštěno“. Pravidlo pokládá za vloženou tuto dočasnou tabulku: Pouze řádek (Bořivoj,121) je vložen do VPZ. ZaměstnanecPlat Božena73 Jan73 Josef89 Bořivoj121 Oldřich97 Bořivoj121 Oldřich97
21 Oracle Podporuje triggery definované v předběžné dokumentaci k SQL3 Akce triggerů mohou zahrnovat libovolný PL/SQL kód Podpora dvou odlišných přístupů (granularita) Řádková úroveň (row level) – Daty řízené triggery Příkazová úroveň (statement level) – Událostmi řízené triggery Okamžité spouštění triggerů (čas aktivace) Před sledovanou operací (before) Po sledované operaci (after)
22 Definice triggeru v Oracle ::= CREATE TRIGGER {BEFORE | AFTER} ON [ [ REFERENCING FOR EACH ROW ] [ WHEN ] ] ::= INSERTED | DELETED | UPDATED [ OF ] ::= OLD AS | NEW AS
23 Algorimus zpracování triggerů Proveď statement-level before triggery Pro každou řádku v cílové tabulce Proveď row-level before triggery Kontrola integritních omezení Proveď modifikaci tabulky Kontrola integritních omezení Proveď statement-level after triggery Možnost zacyklení – v Oracle maximálně 32 zanořených triggerů
24 Příklad III. CREATE TRIGGER Přiobjednej AFTER UPDATE OF Na_skladě ON Sklad WHEN (New. Na_skladě < New.Mez_přiobjednání) FOR EACH ROW DECLARE NUMBER X BEGIN SELECT COUNT (*) INTO X FROM Objednávky WHERE Součástka = New.Součástka IF X=0 THEN INSERT INTO Objednávky VALUES (New.Součástka, New.Počet) END IF; END; SoučástkaNa_skladěMez_přiob.Počet Tabulka Sklad:
25 Příklad III. – pokračování Tabulka Sklad: Transakce 1: UPDATE Sklad SET Na_skladě = Na_skladě - 70 WHERE Součástka = 1 Transakce 2: UPDATE Sklad SET Na_skladě = Na_skladě - 60 WHERE Součástka >= 1 SoučástkaNa_skladěMez_přiob.Počet
26 Ukončení zanořování triggerů Lze sestrojit orientovaný graf, kde vrcholy jsou jednotlivá pravidla. Hrana z vrcholu R1 do R2 vede právě když vykonáním R1 se spustí pravidlo R2. R1 R2 R3 R5 R4
27 Ukončení zanořování triggerů Poznáme z grafu, že proces zanořování někdy skončí? Pokud je graf acyklický, jistě po n krocích skončí. Avšak cykličnost grafu je pouze nutná podmínka k tomu, aby zanořování neskončilo. R1R2R3 Ra R1R2
28 Ukončení zanořování triggerů Uvažujme dvě nezávislé databáze nad stejným schématem, obě s jedním pravidlem Ra resp. Rb – Ra skončí, Rb nikoliv. CREATE RULE Rb ON Zaměstnanci WHEN INSERTED, DELETED, UPDATED (Plat) IF (SELECT AVG(Plat) FROM Zaměstnanci) > 100 THEN UPDATE Zaměstnanci SET Plat = 1.1 * Plat Ra Rb CREATE RULE Ra ON Zaměstnanci WHEN INSERTED, DELETED, UPDATED (Plat) IF (SELECT AVG(Plat) FROM Zaměstnanci) > 100 THEN UPDATE Zaměstnanci SET Plat = 0.9 * Plat
29 Shrnutí Událost => Podmínka => Akce Algoritmy zpracování triggerů Výběr podle priorit Vyhodnocení a provádění triggerů Okamžité (Immediate) - Oracle Odložené (Deffered) - Starburst Oddělené (Detached) Problémy se zacyklením Dynamická aktivace a deaktivace triggerů
30 Otázky?