Aktivní databáze
description
Transcript of Aktivní databáze
Aktivní databázeŠípek, Chudoba 15.10.2013
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
ZdrojAdvanced 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 - SyntaxCREATE RULE <jméno pravidla> ON <jméno tabulky>
WHEN <INSERT|UPDATE|DELETE [<jméno sloupce>]>
[IF <podmínka>]
THEN <akce>
[PRECEDES <jména pravidel>]
[FOLLOWS <jména pravidel>]
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í algoritmusDokud 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říkladCREATE RULE KontrolaVyplat ON zamWHEN INSERTED, DELETED, UPDATED (plat)IF (SELECT AVG(plat) FROM zam) > 100THEN UPDATE zam SET plat = .9 * plat
Zamestnanec Plat
Adam 90
Bedrich 90
Cyril 110
Starburst - Příklad● Vložíme 2 řádky: (David,150) a (Emil, 120)
Zamestnanec Plat
Adam 90
Bedrich 90
Cyril 110
Zamestnanec Plat
Adam 81
Bedrich 81
Cyril 99
David 135
Emil 108
Zamestnanec Plat
Adam 73
Bedrich 73
Cyril 89
David 121
Emil 97
1. zavolání triggeruPrumer je 112
2. zavolání triggeruPrumer je 101
Starburst - Příklad 2CREATE RULE VysocePlaceni ON zamWHEN INSERTEDIF EXISTS(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 <jméno triggeru> ON <tabulka>
● Zahození triggeru○ DROP RULE <jméno triggeru> ON <tabulka>
● Sdružování pravidel ○ CREATE RULESET <jméno množiny>○ ALTER RULESET <jméno množiny>
[ADDRULE <jména pravidel>]
[DELRULE <jména pravidel>]
Starburst - Další příkazy● Explicitní volání triggerů
○ PROCESS RULESET <jméno množiny> ○ PROCESS RULE <jméno triggeru>
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/SQLo Poměrně silný vyjadřovací prostředek
• Narozdíl od Starburstu jsou triggery vykonávány ihned, nečeká se na commito 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- SyntaxCREATE TRIGGER <jméno triggeru>{ BEFORE | AFTER } <události> [OF <jména sloupců>]ON <jméno tabulky>[REFERENCING <reference>][FOR EACH ROW][WHEN <podmínka>] <PL/SQL kód>
<reference> := OLD AS <pojmenování staré n-tice>NEW AS <pojmenování staré n-tice>
Oracle- Syntax• Řádkové triggery mohou používat speciální predikáty
určující spouštěcí událosto INSERTING, DELETING, UPDATING
• Řádkové triggery jsou označeny klauzulí FOR EACH ROWo 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
algoritmem1) 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 řádkuc) 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říkazu4) 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émemo neexistuje způsob, kterým může programátor jejich pořadí ovlivnit
• Triggery mohou spouštět další triggeryo 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 ROLLBACKo pouze na úrovni příkazu, ne celé transakce
Oracle - PříkladCREATE TRIGGER Priobjednej
AFTER UPDATE OF NaSklade ON Sklad
WHEN (New.NaSklade < New.BodPriobjednani)
FOR EACH ROWDECLARE NUMBER XBEGIN
SELECT COUNT (*) INTO XFROM Objednavky
WHERE Soucastka = New.Soucastka
IF X = 0
THENINSERT INTO Objednavky
VALUES (New.Soucastka, New.PocetPriobjednani, SYSDATE)
ENDIFEND
Oracle - PříkladSKLAD:
Události:
T1: UPDATE Sklad T2: UPDATE Sklad
SET NaSklade = NaSklade - 70 SET NaSklade = NaSklade- 60
WHERE Soucastka = 1 WHERE Soucastka >= 1
Soucastka NaSklade BodPriobjednani PocetPriobjednani
1 200 150 100
2 780 500 200
3 450 400 120
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částka PočetPriobjednani Datum
1 100 2013-10-15
3 120 2013-10-15
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 Oracleo řádkové/příkazovéo BEFORE/AFTER
DB2 - SyntaxCREATE TRIGGER <jméno triggeru>{ BEFORE | AFTER } <událost> [ OF <jména sloupců> ]ON <jméno tabulky>[ REFERENCING <reference> ]FOR EACH { ROW | STATEMENT }WHEN (<SQL podmínka>)<SQL kód>
<reference> := { OLD | NEW | OLD_TABLE | NEW_TABLE} AS <jméno zástupné proměnné>
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ěň NEW4) 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ší triggeryo 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.
Soucastka Dodavatel Cena
1 Adam 150
2 Bedrich 500
3 Megasklad 400
4 Adam 800
Distributor Město Stát
Adam Pitsburgh Pensilvánie
Bedrich Minneapolis Minnesota
Megasklad Atlanta Georgia
DB2 - Příklad• Defaultním dodavatelem je Megasklad
• Je definován cizí klíč
FOREIGN KEY (Dodavatel)REFERENCES DistributorON DELETE SET DEFAULT
DB2 - PříkladCREATE TRIGGER JedenDodavatelBEFORE UPDATE OF Dodavatel ON SoucastkyREFERENCING NEW AS NFOR EACH ROWWHEN (N.Dodavatel IS NULL)
SIGNAL SQLSTATE ‘70005’ (‘Dodavatel nesmi byt NULL’)
DB2 - PříkladCREATE TRIGGER AuditDodavateluAFTER UPDATE ON SoucastkyREFERENCING OLD_TABLE AS OTFOR EACH STATEMENT
INSERT INTO AuditVALUES (USER, CURRENT_DATE,
(SELECT COUNT(*) FROM OT))
DB2 - Příklad• Zvažme následující transakci T1DELETE FROM DistributoriWHERE 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 modeluo dotazovací jazyko 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
• Atributyo zachycují stav třídy o atomické typy (integer,string atd.)o jména třído konstruktory set, record a list
Chimera - Definice datového modeludefine object class Zamestnanecattributes Jmeno: string, Plat: integerend;
define object class Oddeleniattributes 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 konstantyo 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
• Formuleo 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ů<definice-triggeru> ::= define <možnosti> trigger <jméno triggeru>
[ for <jméno třídy> ]
events <události>
condition <formule>
actions <proceduralni výraz>
[ { before | after } <jména triggerů>] //nutno dodržet acyklicitu
end<možnosti> ::= [ <možnosti eventu> ] | [ <možnosti vykonání>]
<možnosti eventu> ::= [ {event-consuming | event-preserving }]<možnosti vykonání> ::= [ {deferred | immediate }]
<události> ::= create | delete | modify [(<jméno-atributu>)]
Chimera - Sémantika triggerů
• Targetedo uvedeno jméno třídy po klíčovém slovu foro lze na danou třídu odkazovat pomocí Selfo eventy týkající se pouze této třídy, uvadíme pouze jako create,
modify, delete
• Untargetedo 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 savepointo 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 triggeruiii. 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 eventyo 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)
• Syntaxeo <event-formula> ::= {occurred | holds } ( <seznam-eventů> , <event-variable> )
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 Zamestnanecevents create, modify(Plat)condition Self.Plat > Self.Vedouci.Platactions modify(Zamestnanec.Plat,Self, Self.Vedouci.Plat)end;
Chimera - Příklad• Okamžité vykonávání
define immediate trigger ImmUpravPlat for Zamestnanecevents create, modify(Plat)condition occurred(create, modify(Plat),Self) //pouze ovlivněné objekty
Self.Plat > Self.Vedouci.Platactions modify(Zamestnanec.Plat,Self,Self.Vedouci.Plat)end;
Využití aktivních databází
• Internío údržba datové integrityo správa odvozených dato zálohování dato 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é rollbackyo 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á datao virtuální - data spočítána při každém dotazuo 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četo 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í kopieo 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 = TRUEactions 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
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álosto změna stavuo dotaz do databázeo naplánované událostio lze volat i explicitně
• podmínkao 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 dato externí procedurao 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 vrstvouo aktivní pravidla - vhodné psát pouze kratší, jinak velmi nepřehledné