Aktivní databáze Šípek, Chudoba
Obsah ●Zdroj ●Aktivní databáze - definice ●Reálné systémy ○ Starburst ○ Oracle ○ DB2 ○ Chimera ●Příklady použití ●Základní pojmy - shrnutí ●Závěr
Zdroj Advanced Database Systems (The Morgan Kaufmann Series in Data Management Systems) Carlo Zaniolo Stefano Ceri Christos Faloutsos Richard T. Snodgrass V. S. Subrahmanian Roberto Zicari
Aktivní databáze - definice ●Klasické databáze mají pouze možnost integritních omezení ○ne vždy dostatečné ●Aktivní databáze poskytují navíc aktivní prvky - Triggery ○Událost - podmínka - akce ●Původně plánováno v SQL92, nakonec až v SQL3
Důvody použití ●Pravidla mohou být komplexnější než integritní omezení ●Usnadňují programátorskou práci
Reálné systémy ●Starburst ●Oracle ●DB2 ●Chimera
Starburst - historie ●Vyvinuto IBM ●Jednoduchá syntaxe i sémantika
Starburst - Syntax ●ECA model ○Událost - podmínka - akce ●Události ○INSERT, DELETE, UPDATE ●Podmínka ○booleovský predikát vyjádřený v SQL ●Akce ○SQL dotazy (SELECT, INSERT, DELETE, UPDATE) + ROLLBACK
Starburst - Syntax CREATE RULE ON WHEN ]> [IF ] THEN [PRECEDES ] [FOLLOWS ]
Starburst - Sémantika ●Triggery jsou volány po transakčním příkazu COMMIT ●Triggery, které jsou navázány na události v probíhající transakci tvoří tzv. “konfliktní množinu” ●Pro volání je použitý následující algoritmus Dokud je konfliktní množina neprázdná: 1) Vezmi trigger T s nejvyšší prioritou z konfliktní množiny 2) Vyhodnoť podmínku triggeru T 3) Pokud je podmínka triggeru T splněna, vykonej akci triggeru T
Starburst - Sémantika ●Priority triggerů jsou určeny sekcemi FOLLOWS a PRECEDES ○Acyklicita je pouze na programátorovi ●Pokud mají 2 triggery stejnou prioritu, je první vyhodnocen ten, který byl dřív nadefinován ●Pomocné tabulky INSERTED, DELETED, OLD-UPADTED, NEW- UPDATED
Starburst - Net effect ●Každá n-tice změněných dat se objeví v pomocných tabulkách pouze jednou ●Pokud se vložíme n-tici t1 a následně ji pomocí příkazu update změníme na t2, v tabulce INSERTED se objeví n-tice t2 ●Pokud vložíme n-tici t a následně jí smažeme, tak to bude mít nulový efekt
Starburst - Příklad CREATE RULE KontrolaVyplat ON zam WHEN INSERTED, DELETED, UPDATED (plat) IF(SELECT AVG(plat) FROM zam) > 100 THEN UPDATE zam SET plat =.9 * plat ZamestnanecPlat Adam90 Bedrich90 Cyril110
Starburst - Příklad ●Vložíme 2 řádky: (David,150) a (Emil, 120) ZamestnanecPlat Adam90 Bedrich90 Cyril110 ZamestnanecPlat Adam81 Bedrich81 Cyril99 David135 Emil108 ZamestnanecPlat Adam73 Bedrich73 Cyril89 David121 Emil97 1. zavolání triggeru Prumer je zavolání triggeru Prumer je 101
Starburst - Příklad 2 CREATE RULE VysocePlaceni ON zam WHEN INSERTED IFEXISTS(SELECT * FROM INSERTED WHERE Plat > 100 ) THEN INSERT INTO VysocePlaceniZam (SELECT * FROM INSERTED WHERE Plat > 100 ) FOLLOWS KontrolaVyplat Při commitu stejné transakce jako v předešlém případě bude v tabulce VysocePlaceniZam pouze řádek (David, 121) kvůli Net efektu
Starburst - Další příkazy ●Aktivace / deaktivace triggerů ○(DE)ACTIVATE RULE ON ●Zahození triggeru ○DROP RULE ON ●Sdružování pravidel ○CREATE RULESET ○ALTER RULESET [ADDRULE ] [DELRULE ]
Starburst - Další příkazy ● Explicitní volání triggerů ○PROCESS RULESET ○PROCESS RULE
Reálné systémy ●Starburst ●Oracle ●DB2 ●Chimera
Oracle Triggery implementovány na základě předběžné verze standardu SQL3 Akce jsou psány v jazyce PL/SQL o Poměrně silný vyjadřovací prostředek Narozdíl od Starburstu jsou triggery vykonávány ihned, nečeká se na commit o Díky tomu je možno rozdělit triggery na Before a After
Oracle 2 úrovně triggerů o Řádkový (row-level) - je volaný pro každý řádek ovlivněný spouštěcí událostí zvlášť o Příkazový (statement-level) - je volaný na celou ovlivněnou tabulku najednou
Oracle- Syntax CREATE TRIGGER { BEFORE | AFTER } [OF ] ON [REFERENCING ] [FOR EACH ROW] [WHEN ] := OLD AS NEW AS
Oracle- Syntax Řádkové triggery mohou používat speciální predikáty určující spouštěcí událost o INSERTING, DELETING, UPDATING Řádkové triggery jsou označeny klauzulí FOR EACH ROW o Pokud klauzule není přítomná, trigger je příkazový Podmínka za WHEN se může psát pouze u řádkových triggerů o U příkazových triggerů mohu podmínku psát v PL/SQL kódu za WHERE
Oracle- Syntax Proměnné OLD a NEW, popřípadě jejich přejmenování pomocí REFERENCING lze používat pouze u řádkových triggerů o Intuitivně je v nich uložen obsah řádku před a po změně
Oracle - Sémantika Pořadí spouštění triggerů je dáno následujícím algoritmem 1) Proveď příkazové triggery prováděné před spouštěcí událostí (BEFORE) 2) Pro každou řádku v příslušné tabulce: a) Proveď řádkové triggery prováděné před spouštěcí událostí (BEFORE) b) Proveď změnu příslušné řádky a zkontroluj, zda platí příslušná integritní omezení na úrovni řádku c) Proveď řádkové triggery prováděné po spouštěcí události (AFTER) 3) Zkontroluj, zda platí příslušná integritní omezení na úrovni příkazu 4) Proveď příkazové triggery prováděné po spouštěcí události (AFTER)
Oracle - Sémantika Pořadí triggerů, které jsou spouštěny ve stejném kroku předchozího algoritmu je určeno systémem o neexistuje způsob, kterým může programátor jejich pořadí ovlivnit Triggery mohou spouštět další triggery o maximální hloubka zanoření je 32 - slouží jako kontrola zacyklení o po přesažení této hloubky je vyvolaná vyjímka Po vyvolání vyjímky je zavolán ROLLBACK o pouze na úrovni příkazu, ne celé transakce
Oracle - Příklad CREATE TRIGGER Priobjednej AFTER UPDATE OF NaSklade ON Sklad WHEN (New.NaSklade < New.BodPriobjednani) FOR EACH ROW DECLARE NUMBER X BEGIN SELECT COUNT (*) INTO X FROM Objednavky WHERE Soucastka = New.Soucastka IF X = 0 THEN INSERT INTO Objednavky VALUES (New.Soucastka, New.PocetPriobjednani, SYSDATE) ENDIF END
Oracle - Příklad SKLAD: Události: T1:UPDATE SkladT2:UPDATE Sklad SET NaSklade = NaSklade - 70SET NaSklade = NaSklade- 60 WHERE Soucastka = 1WHERE Soucastka >= 1 SoucastkaNaSkladeBodPriobjednaniPocetPriobjednani
Oracle - Příklad Oba příkazy T1 a T2 probíhají nezávisle o Příkaz T2 je prováděn již nad upravenou tabulkou Sklad Výsledek v tabulce Objednavky po T1 a T2 bude: SoučástkaPočetPriobjednaniDatum
Reálné systémy ●Starburst ●Oracle ●DB2 ●Chimera
DB2 - historie Vytvořeno IBM Snaha o precizní jednoznačnou sémantiku Využíva zkušeností ze staršího projektu Starburst
DB2 - Syntax Každý trigger smí být navázán pouze na jednu událost UPDATE smí být navázán na konkrétní sloupce Dělení triggerů je jako u Oracle o řádkové/příkazové o BEFORE/AFTER
DB2 - Syntax CREATE TRIGGER { BEFORE | AFTER } [ OF ] ON [ REFERENCING ] FOR EACH { ROW | STATEMENT } WHEN ( ) := { OLD | NEW | OLD_TABLE | NEW_TABLE} AS
DB2 - Syntax Proměnné OLD a NEW zastupují jako v Oracle aktualní řádek ( pří řádkovém triggeru ) před a po změně Proměnné OLD_TABLE a NEW_TABLE zastupují tabulku změněných řádků ( pří příkazovém triggeru ) před a po změně
DB2 - Sémantika BEFORE triggery mohou měnit data před jejich aktualizací, ale nemohou měnit obsah databáze Na jednu událost může být navázáno více triggerů, volány jsou pak podle data vytvoření
DB2 - Sémantika Pokud se triggery volají navzájem, použije se následující algoritmus: Pro příkaz S v akci A triggeru, který vyvolá událost E: 1) Pozastav provádění A a ulož její pracovní data na zásobník 2) Spočítej OLD a NEW vzhledem k E 3) Vykonej všechny BEFORE triggery vzhledem k E, popřípadě změň NEW 4) Aplikuj změny z NEW do databáze 5) Vykonej všechny AFTER triggery vzhledem k E. Pokud jejich akce spustí další triggery, celý proces rekurzivně opakuj 6) Vyber ze zásobníku pracovní data pro A a pokračuj v jejím vyhodnocování
DB2 - Sémantika V bodě 4 se při aplikování změn z NEW do databáze mohou porušit integritní omezení, které mohou opět vyvolat další triggery o postupuje se velmi podobně, jako v bodě 5 - rekurzivní zpracování triggerů
DB2 - Příklad Uvažme schéma s 3 tabulkami - Soucastky, Distributori a Audit. Tabulka Audit je na začátku prázdná V tabulce Soucastky je primární klíč Soucastka, v tabulce Distributori je primární klíč Distributor. SoucastkaDodavatelCena 1Adam150 2Bedrich500 3Megasklad400 4Adam800 DistributorMěstoStát AdamPitsburghPensilvánie BedrichMinneapolisMinnesota MegaskladAtlantaGeorgia
DB2 - Příklad Defaultním dodavatelem je Megasklad Je definován cizí klíč FOREIGN KEY (Dodavatel) REFERENCES Distributor ON DELETE SET DEFAULT
DB2 - Příklad CREATE TRIGGER JedenDodavatel BEFORE UPDATE OF Dodavatel ON Soucastky REFERENCING NEW AS N FOR EACH ROW WHEN (N.Dodavatel IS NULL) SIGNAL SQLSTATE ‘70005’ (‘Dodavatel nesmi byt NULL’)
DB2 - Příklad CREATE TRIGGER AuditDodavatelu AFTER UPDATE ON Soucastky REFERENCING OLD_TABLE AS OT FOR EACH STATEMENT INSERT INTO Audit VALUES (USER, CURRENT_DATE, (SELECT COUNT(*) FROM OT))
DB2 - Příklad Zvažme následující transakci T1 DELETE FROM Distributori WHERE Stat = ‘Pensilvanie’ Vymazání řádku distrubutora Adama způsobí změnu dodavatele u součástek 1 a 4. Trigger JedenDodavatel proběhne pro každý změněný řádek (1 a 4), ale ani u jednoho není splněna podmínka Trigger AuditDodavatelů proběhne pouze jednou a zaznamená, že aktuální uživatel dnes změnil 2 řádky
Reálné systémy ●Starburst ●Oracle ●DB2 ●Chimera
Chimera Objektově orientovaný databázový jazyk Obstarává tyto 3 základní části o definice datového modelu o dotazovací jazyk o jazyk aktivních pravidel (triggery)
Chimera - Definice datového modelu Objektově orientovaný Třídy (object classes) o základní stavební prvek o hierarchicky uspořádány Atributy o zachycují stav třídy o atomické typy (integer,string atd.) o jména tříd o konstruktory set, record a list
Chimera - Definice datového modelu define object class Zamestnanec attributes Jmeno: string, Plat: integer end; define object class Oddeleni attributes Nazev: string, Zamestnanci: set-of(Zamestnanec) end;
Chimera - Dotazovací jazyk Deklarativní dotazovací jazyk Základními stavebními prvky termy a formule Termy o atomické - proměnné a konstanty o složené - složené z atomických termů pomocí: konstruktorů set, list, record funkcí Chiméry jako jsou atributy, selektory či předdefinované operátory
Chimera - Dotazovací jazyk Formule o Atomické - složeny z predikátového symbolu a seznamu termů(jako parametry) typy - integer(X) třídy - Zamestnanec(X) porovnání - X.Jmeno = “Jan” náležení - Z in X.Oddeleni o Složené - skládány z atomických formulí pomocí disjunkce a negace, kde negaci lze aplikovat pouze na atomické formule Zamestnanec(X),Oddeleni(Y), Y.Nazev = “Hracky”, not ( X in Y.Zamestnanci )
Chimera - Procedurální výrazy select(cílový seznam where podmínka) o select(Z where Zamestnanec(Z), Z.jmeno = 'Jan') create(třída, hodnota, výstupní proměnná) o create(Zamestnanec, ['Jan', 55000], Z) delete(třída, proměnná) o delete(Zamestanec, Z) modify(název atributu, proměnná, term) o modify(Zamestnanec.Plat, Z, Z.plat * 0.96)
Chimera - Transakční řádky Seznam procedurálních výrazů oddělený čárkami a ukončený středníkem Viditelnost a hodnota proměnných definovaná právě transakční řádkou Jedná se o nejmenší změnu stavu vyvolávající trigger
Chimera - Syntaxe triggerů ::= define trigger [ for ] events condition actions [ { before | after } ] //nutno dodržet acyklicitu end ::= [ ] | [ ] ::=[ {event-consuming | event-preserving }] ::= [ {deferred | immediate }] ::= create | delete | modify [( )]
Chimera - Sémantika triggerů Targeted o uvedeno jméno třídy po klíčovém slovu for o lze na danou třídu odkazovat pomocí Self o eventy týkající se pouze této třídy, uvadíme pouze jako create, modify, delete Untargeted o eventy se týkají libovolné třídy, nutno uvádět plné znění například create(Zamestanci)
Chimera - Sémantika triggerů Okamžité(immediate) o volány po dokončení transakční řádky Odložené(deffered) o volány po příkazech commit či savepoint o mohou vyvolávat okamžité triggery, ty jsou v tomto případě zpracovávány jako triggery odložené
Chimera - Sémantika triggerů Význam pouze pokud je event vyvolán vícekrát v průběhu jedné transakce Event pohlcující (event-consuming) o prováděn pouze poprvé, poté je již přeskakován Event ponechávající (event-preserving) o prováděn pokaždé v rámci transakce
Chimera - zpracování triggerů Množina spuštěných triggerů (conflict set), stejně jako u Starburstu Algoritmus zpracování: o Dokud je množina spuštěných triggerů neprázdná dělej: i.Vyber trigger s nejvyšší prioritou a označ ho za nespuštěný ii.Vyhodnoť podmínku triggeru iii.Pokud je splněna, vykonej akci daného triggeru Upřesnění: Pokud je triggerů s nejvyšší prioritou více, systém použije interní uspořádání (deterministické), které není ovlivnitelné uživatelem. Pokud je trigger zařazen do fronty, máme narozdíl od Startbustu (viz net effect) jistotu, že tento trigger proběhne.
Chimera - Occurred and holds Binární predikáty umožňující zjistit identifikátory všech objektů, které byly ovlivněné danými eventy o Occured - vrací všechny ovlivněné objekty (resp. jejich identifikátory) o Holds - vrací pouze podmnožinu těchto objektů, založenou na průběhu net effect ( create, modify, modify, delete => žádný net effect) Syntaxe o ::= {occurred | holds } (, )
Chimera - Příklad Datový model define object class Zamestnanec attributes Jmeno: string, Plat: integer, Vedouci : Zamestnanec end; Třída Zaměstnanci { (o1,”Jan”,3500,o2), (o2,”Tomáš”,4500,null), (o3,”Robert”,4300,o2) } Transakce select(X where Zamestnanec(X),X.Jmeno = “Tomáš”),modify (Zamestnanec.Plat,X,5000); select(X where Zamestnanec(X),X.Jmeno = “Jan”),modify (Zamestnanec.Plat,X,5300);
Chimera - Příklad Defaultní nastavení - odložené a event pohlcující define trigger UpravPlat for Zamestnanec events create, modify(Plat) condition Self.Plat > Self.Vedouci.Plat actions modify(Zamestnanec.Plat,Self, Self.Vedouci.Plat) end;
Chimera - Příklad Okamžité vykonávání define immediate trigger ImmUpravPlat for Zamestnanec events create, modify(Plat) conditionoccurred(create, modify(Plat),Self) // pouze ovlivněné objekty Self.Plat > Self.Vedouci.Plat actions modify(Zamestnanec.Plat,Self,Self.Vedouci.Plat) end;
Využití aktivních databází Interní o údržba datové integrity o správa odvozených dat o zálohování dat o méně obvykle - správa verzí, správa zabezpečení či logování Externí (bussiness rules) o logika aplikace, která standardně bývá až na aplikační vrstvě o Alerters - pouze upozorní pověřenou osobu na výjimečnou situaci v databázi
Příklady využití Údržba integrity Údržba odvozených dat Zálohování Správa workflow Business rules
Údržba integrity Integritní omezení(constraints) vyjádřena predikáty, které musí databáze splňovat Vestavěné omezení - speciální konstrukt jazyka v datové definici (keys, unique,notnull atd.) Obecná omezení - specifikováno libovolným dotazem či predikátem o ne vždy podporováno, simulujeme pomocí aktivních pravidel
Údržba integrity událost - podmínka - nápravná akce nápravná akce dvojího typu : o rušící pravidla(abort rules) - zavolán rollback command jednoduché, ale velmi časté rollbacky o opravná pravidla(repair rules) - definována akce, která opraví integritu dat SQL 92 - CASCADE, RESTRICT, SET NULL, SET DEFAULT
Příklady využití Údržba integrity Údržba odvozených dat Zálohování Správa workflow Business rules
Údržba odvozených dat Pohled - jedná se o tabulku či třídu, odvozenou z dat v databázi na základě nějakého dotazu Odvozený atribut - atribut jehož hodnota je odvozena derivační formulí, rovnocenný jakémukoliv jinému atributu v databázi Odvozená data o virtuální - data spočítána při každém dotazu o materializovaná - data persistentně uložené v databázi aktualizace pomocí aktivních pravidel
Údržba odvozených dat Materializace o obnova - odvozená tabulka, celá znovu přepočítána velmi jednoduché - lze generovat automaticky,ale náročné na výpočet o inkrementální přístup - spočívá ve výpočtu negativních a pozitivních přírůstků, které jsou přidány respektive odebrány z daného pohledu velmi složité - problémy hlavně s rekurzí
Příklady využití Údržba integrity Údržba odvozených dat Zálohování Správa workflow Business rules
Zálohování V podstatě se jedná o odvozená data, kdy se udržuje několik jejich kopií Distribuované systémy - dva a více databázových serverů udržují stejná data (problém se synchronizací) Primární a sekundární kopie o změny prováděny pouze na primární kopii, sekundární je read-only o capture module tyto změny propaguje na sekundární kopie (změny na kopii prováděny přes apply module) Symetrické zálohování o každý server je zároveň primární i sekundární kopií o při souběžných updatech dochází k nekonzistencím mezi kopiemi
Příklady využití Údržba integrity Údržba odvozených dat Zálohování Správa workflow Business rules
Správa workflow Pomocí aktivních pravidel lze řídit také například fungování celé společnosti (resp. rozdělování práce) Hledání náhrady za nedostupného zaměstnance pro důležitý úkol define triggger WF for Zamestnanec events modify(Zamestnanec.Dostupnost) condition Zamestnanec(Z), occurred(modify(Zamestnanec.Dostupnost),Z), Z.Dostupnost = FALSE, ukol(U), U.OdpovednyZam = Z, U.Typ =”Důležitý”, Zamestnanec(Z2), Z.Nahrada = Z2, Z2.Dostupnost = TRUE actions modify(Ukol.OdpovednyZam,U,Z2) end;
Příklady využití Údržba integrity Údržba odvozených dat Zálohování Správa workflow Business rules
Aktivní pravidla mohou nahrazovat skoro celou aplikační logiku Reagují na změny reálného světa Výhoda - logika je sdílena všemi aplikacemi postavenými nad touto databází Nevýhoda - jazyky pro aktivní pravidla, jsou velmi složité a programátorsky nepřívětivé EMS - italská elektrická distribuční síť ❖ veškerá pravidla pro přidávání uzlů či vyvažování toku jsou naprogramovány pomocí aktivních pravidel
Základní pojmy - shrnutí Událost – podmínka - akce událost o změna stavu o dotaz do databáze o naplánované události o lze volat i explicitně podmínka o databázový dotaz (TRUE pokud neprázdný výsledek, FALSE při prázdném) o databázový predikát
Základní pojmy - shrnutí akce o libovolná úprava dat o externí procedura o typicky: rollback či definovaná opravná akce
Základní pojmy - shrnutí Okamžité vykonávání(immediate) o vykonáno ihned po vyhodnocení podmínky Odložené vykonávání (deffered) o akce je vyvolána až na konci transakce (příkazem commit)
Závěr Velmi silný nástroj, vhodně rozšiřující možnosti databáze Podporováno všemi moderními databázovými systémy Nutno najít rozumnou míru mezi aplikační a databázovou vrstvou o aktivní pravidla - vhodné psát pouze kratší, jinak velmi nepřehledné