1 / 75

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. Zdroj. Advanced Database Systems (The Morgan Kaufmann Series in Data Management Systems) Carlo Zaniolo

sarai
Download Presentation

Aktivní databáze

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Aktivní databáze Šípek, Chudoba 15.10.2013

  2. 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

  3. 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

  4. 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

  5. Důvody použití • Pravidla mohou být komplexnější než integritní omezení • Usnadňují programátorskou práci

  6. Reálné systémy • Starburst • Oracle • DB2 • Chimera

  7. Starburst - historie • Vyvinuto IBM • Jednoduchá syntaxe i sémantika

  8. 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

  9. Starburst - Syntax CREATE 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>]

  10. 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

  11. 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

  12. 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

  13. 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

  14. Starburst - Příklad • Vložíme 2 řádky: (David,150) a (Emil, 120) 1. zavolání triggeru Prumer je 112 2. zavolání triggeru Prumer je 101

  15. Starburst - Příklad 2 CREATE RULE VysocePlaceni ON zam WHEN INSERTED IF EXISTS(SELECT *FROM INSERTED WHERE Plat > 100 ) THEN INSERT INTO VysocePlaceniZam (SELECT *FROM INSERTED WHERE Plat > 100 ) FOLLOWSKontrolaVyplat • 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

  16. 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>]

  17. Starburst - Další příkazy • Explicitní volání triggerů • PROCESS RULESET <jméno množiny> • PROCESS RULE <jméno triggeru>

  18. Reálné systémy • Starburst • Oracle • DB2 • Chimera

  19. Oracle • Triggery implementovány na základě předběžné verze standardu SQL3 • Akce jsou psány v jazyce PL/SQL • Poměrně silný vyjadřovací prostředek • Narozdíl od Starburstu jsou triggery vykonávány ihned, nečeká se na commit • Díky tomu je možno rozdělit triggery na Before a After

  20. Oracle • 2 úrovně triggerů • Řádkový (row-level) - je volaný pro každý řádek ovlivněný spouštěcí událostí zvlášť • Příkazový (statement-level) - je volaný na celou ovlivněnou tabulku najednou

  21. Oracle- Syntax CREATE 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>

  22. Oracle- Syntax • Řádkové triggery mohou používat speciální predikáty určující spouštěcí událost • INSERTING, DELETING, UPDATING • Řádkové triggery jsou označeny klauzulí FOR EACH ROW • Pokud klauzule není přítomná, trigger je příkazový • Podmínka za WHEN se může psát pouze u řádkových triggerů • U příkazových triggerů mohu podmínku psát v PL/SQL kódu za WHERE

  23. Oracle- Syntax • Proměnné OLD a NEW, popřípadě jejich přejmenování pomocí REFERENCING lze používat pouze u řádkových triggerů • Intuitivně je v nich uložen obsah řádku před a po změně

  24. 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)

  25. Oracle - Sémantika • Pořadí triggerů, které jsou spouštěny ve stejném kroku předchozího algoritmu je určeno systémem • neexistuje způsob, kterým může programátor jejich pořadí ovlivnit • Triggery mohou spouštět další triggery • maximální hloubka zanoření je 32 - slouží jako kontrola zacyklení • po přesažení této hloubky je vyvolaná vyjímka • Po vyvolání vyjímky je zavolán ROLLBACK • pouze na úrovni příkazu, ne celé transakce

  26. 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

  27. Oracle - Příklad SKLAD: Události: T1: UPDATE SkladT2: UPDATE Sklad SET NaSklade = NaSklade - 70 SET NaSklade = NaSklade- 60 WHERE Soucastka = 1 WHERE Soucastka >= 1

  28. Oracle - Příklad • Oba příkazy T1 a T2 probíhají nezávisle • Příkaz T2 je prováděn již nad upravenou tabulkou Sklad Výsledek v tabulce Objednavky po T1 a T2 bude:

  29. Reálné systémy • Starburst • Oracle • DB2 • Chimera

  30. DB2 - historie • Vytvořeno IBM • Snaha o precizní jednoznačnou sémantiku • Využíva zkušeností ze staršího projektu Starburst

  31. 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 • řádkové/příkazové • BEFORE/AFTER

  32. DB2 - Syntax CREATE 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é>

  33. 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ě

  34. 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í

  35. 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í

  36. 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 • postupuje se velmi podobně, jako v bodě 5 - rekurzivní zpracování triggerů

  37. 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.

  38. DB2 - Příklad • Defaultním dodavatelem je Megasklad • Je definován cizí klíč FOREIGN KEY (Dodavatel) REFERENCES Distributor ON DELETE SET DEFAULT

  39. 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’)

  40. 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))

  41. 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

  42. Reálné systémy • Starburst • Oracle • DB2 • Chimera

  43. Chimera • Objektově orientovaný databázový jazyk • Obstarává tyto 3 základní části • definice datového modelu • dotazovací jazyk • jazyk aktivních pravidel (triggery)

  44. Chimera - Definice datového modelu • Objektově orientovaný • Třídy (object classes) • základní stavební prvek • hierarchicky uspořádány • Atributy • zachycují stav třídy • atomické typy (integer,string atd.) • jména tříd • konstruktory set, record a list

  45. 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;

  46. Chimera - Dotazovací jazyk • Deklarativní dotazovací jazyk • Základními stavebními prvky termy a formule • Termy • atomické - proměnné a konstanty • 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

  47. Chimera - Dotazovací jazyk • Formule • 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 inX.Oddeleni • 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 )

  48. Chimera - Procedurální výrazy • select(cílový seznam where podmínka) • select(Z where Zamestnanec(Z), Z.jmeno = 'Jan') • create(třída, hodnota, výstupní proměnná) • create(Zamestnanec, ['Jan', 55000], Z) • delete(třída, proměnná) • delete(Zamestanec, Z) • modify(název atributu, proměnná, term) • modify(Zamestnanec.Plat, Z, Z.plat * 0.96)

  49. 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

  50. 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>)]

More Related