Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Databázové Aplikace Slidy k přednášce NDBI026 KSI MFF UK

Podobné prezentace


Prezentace na téma: "Databázové Aplikace Slidy k přednášce NDBI026 KSI MFF UK"— Transkript prezentace:

1 Databázové Aplikace Slidy k přednášce NDBI026 KSI MFF UK
Verze 1

2 DBI026 -DB Aplikace - MFF UK
Literatura Manuálové stránky Oracle 11g Dostupné odkudkoli Dostupné z domény .mff.cuni.cz DBI026 -DB Aplikace - MFF UK 2

3 DBI026 -DB Aplikace - MFF UK
Literatura, pokrač. Manuálové stránky MS SQL Dostupné odkudkoli en-us/library/bb aspx DBI026 -DB Aplikace - MFF UK 3

4 DBI026 -DB Aplikace - MFF UK
Literatura, pokrač. D. Quass, J. Widom. R. Goldman, K. Haas, Q. Luo, J. McHugh, S. Nestorov, A. Rajaraman, H. Rivero, S. Abiteboul, J. Ullman, and J. Wiener: LORE: A Lightweight Object REpository for Semistructured Data, Roy Goldman, Jennifer Widom: DataGuides: Enabling Query Formulation and Optimalization in Semistructured Databases, DBI026 -DB Aplikace - MFF UK 4

5 DBI026 -DB Aplikace - MFF UK
Přednáška č. 1 O čem to bude? Předpoklady Databázové systémy Základy SQL SELECT příkazy Návrh schémat Normální formy Vlastnosti transakcí, serializovatelnost, Co se dozvím Praktický návrh aplikací Na co si dát pozor Při vytváření relačních schémat Při psaní SQL příkazů Optimalizace odezvy Indexy Plány provádění Ve víceuživatelském provozu Zamykání Transakční zpracování Zabezpečení dat DBI026 -DB Aplikace - MFF UK 5

6 DBI026 -DB Aplikace - MFF UK
Co zde bude Relační model dosud nejrozšířenější a nejpoužívanější Optimalizace dotazů volba indexů a vhodné formulace dotazu může ovlivnit výsledný čas provádění dotazu i o několik řádů Víceuživatelský provoz nevhodně navržená aplikace může způsobovat nekorektní průběh datových manipulací a neočekávané výsledky DBI026 -DB Aplikace - MFF UK 6

7 DBI026 -DB Aplikace - MFF UK
Co zde bude, pokrač. Procedurální rozšíření Triggery pro hlídání korektnosti aktualizací Uložené procedury a funkce Objektové rozšíření Uživatelské datové typy Hnízděné tabulky DBI026 -DB Aplikace - MFF UK 7

8 DBI026 -DB Aplikace - MFF UK
Na čem se cvičí? DB systém Oracle 11g Objektově relační databáze Podpora provádění kódu v jazycích PL/SQL Java C/C++ (obecně jakákoli .dll/.so knihovna) Podpora XML, multimédií a dalších rysů DB MS SQL 2008 R2 Objektově relační databáze Podpora provádění kódu v jazycích T-SQL C# Podpora XML, textu a dalších rysů DBI026 -DB Aplikace - MFF UK 8

9 Problémy ANSI/ISO norem SQL s jejich (ne)dodržováním
SQL-92 ANSI/SQL2;ISO/IEC 9075:1992 Entry, Intermediate, Full SQL-99 ANSI/ISO/IEC 9075:1999 SQL-2003 ISO/IEC 9075:2003 78 99 92 DBI026 -DB Aplikace - MFF UK 9

10 Problémy ANSI/ISO norem SQL s jejich (ne)dodržováním
Jednotlivé databázové servery ne vždy dodržují ANSI normu Obvykle pouze SQL-92 Entry Řada nepřenositelných rozšíření navíc Ne všechny rysy implementovány dle ANSI S novými verzemi se kompatibilita zlepšuje Často nyní existují obě syntaxe zároveň Běžný SQL-92 kompatibilní server 78 92 99 DBI026 -DB Aplikace - MFF UK 10

11 Problémy ANSI/ISO norem SQL s jejich (ne)dodržováním
Čím více se při vývoji aplikace využijí rysy vyšší než SQL-92 Entry Tím menší je šance, že aplikace bude provozuschopná i na jiné databázi Části vyšších verzí jsou často řešeny pouze proprietárně a nepřenositelně Před začátkem vývoje je proto obvykle nutné zvolit cílovou platformu Její změna v prostředku vývoje nebo po nasazení aplikace je velmi drahá Běžný SQL-92 kompatibilní server 78 92 99 DBI026 -DB Aplikace - MFF UK 11

12 Problémy ANSI/ISO norem SQL s jejich (ne)dodržováním
Co v případě, že server nechce SQL příkaz přijmout? Je příkaz nekorektní, nebo server normu nepodporuje? Validátory SQL DBI026 -DB Aplikace - MFF UK 12

13 SELECT příkaz Vestavěné funkce a operátory
Úvod do SQL SELECT příkaz Vestavěné funkce a operátory 13

14 DBI026 -DB Aplikace - MFF UK
SELECT příkaz SELECT [DISTINCT] výraz1 [[AS] c_alias1] [, …] FROM zdroj1 [[AS] t_alias1] [, …] [WHERE podmínka_ř] [GROUP BY výraz_g1 [, …] [HAVING podmínka_s]] [ORDER BY výraz_o1 [, …]] DBI026 -DB Aplikace - MFF UK 14

15 SELECT příkaz - logické vykonání (bez uvažování optimalizace dotazu)
SELECT [DISTINCT] výraz1 [[AS] c_alias1] [, …] FROM zdroj1 [[AS] t_alias1] [, …] [WHERE podmínka_ř] [GROUP BY výraz_g1 [, …] [HAVING podmínka_s]] [ORDER BY výraz_o1 [, …]] Nejprve se zkombinují data ze všech zdrojů (tabulek, pohledů, poddotazů) Pokud jsou odděleny čárkami, provede se kartézský součin ANSI SQL-92 zavádí spojení JOIN ON, NATURAL JOIN, OUTER JOIN, … DBI026 -DB Aplikace - MFF UK 15

16 SELECT příkaz - logické vykonání (bez uvažování optimalizace dotazu)
SELECT [DISTINCT] výraz1 [[AS] c_alias1] [, …] FROM zdroj1 [[AS] t_alias1] [, …] [WHERE podmínka_ř] [GROUP BY výraz_g1 [, …] [HAVING podmínka_s]] [ORDER BY výraz_o1 [, …]] Vyřadí se vzniklé řádky, které nevyhovují podmínce DBI026 -DB Aplikace - MFF UK 16

17 SELECT příkaz - logické vykonání (bez uvažování optimalizace dotazu)
SELECT [DISTINCT] výraz1 [[AS] c_alias1] [, …] FROM zdroj1 [[AS] t_alias1] [, …] [WHERE podmínka_ř] [GROUP BY výraz_g1 [, …] [HAVING podmínka_s]] [ORDER BY výraz_o1 [, …]] Zbylé řádky se seskupí do skupin se stejnými hodnotami uvedených výrazů (SORT/HASH) Každá skupina obsahuje atomické sloupce s hodnotami uvedených výrazů a množinové sloupce se skupinami ostatních hodnot sloupců DBI026 -DB Aplikace - MFF UK 17

18 SELECT příkaz - logické vykonání (bez uvažování optimalizace dotazu)
SELECT [DISTINCT] výraz1 [[AS] c_alias1] [, …] FROM zdroj1 [[AS] t_alias1] [, …] [WHERE podmínka_ř] [GROUP BY výraz_g1 [, …] [HAVING podmínka_s]] [ORDER BY výraz_o1 [, …]] Vyřadí se skupiny, nevyhovující podmínce DBI026 -DB Aplikace - MFF UK 18

19 SELECT příkaz - logické vykonání (bez uvažování optimalizace dotazu)
SELECT [DISTINCT] výraz1 [[AS] c_alias1] [, …] FROM zdroj1 [[AS] t_alias1] [, …] [WHERE podmínka_ř] [GROUP BY výraz_g1 [, …] [HAVING podmínka_s]] [ORDER BY výraz_o1 [, …]] Výsledky se setřídí podle požadavků DBI026 -DB Aplikace - MFF UK 19

20 SELECT příkaz - logické vykonání (bez uvažování optimalizace dotazu)
SELECT [DISTINCT] výraz [[AS] alias] [, …] FROM zdroj1 t_alias1 [, …] [WHERE podmínka_ř] [GROUP BY výraz_g1 [, …] [HAVING podmínka_s]] [ORDER BY výraz_o1 [, …]] Vygeneruje se výstup s požadovanými hodnotami V případě DISTINCT se vyřadí duplicity (SORT/HASH) DBI026 -DB Aplikace - MFF UK 20

21 Co hlídat při psaní SELECT příkazu
Klauzule GROUP BY setřídí před vytvořením skupin všechny řádky dle výrazů v klauzuli, v lepším případě nejdříve řádky podle hash hodnoty výrazů rozdělí do menších přihrádek Seskupovat by se měl co nejmenší možný počet řádek Pokud je možné řádky odfiltrovat pomocí WHERE, je výsledek efektivnější, než následné odstraňování celých skupin DBI026 -DB Aplikace - MFF UK 21

22 Co hlídat při psaní SELECT příkazu
SELECT Ulice, COUNT(*) FROM Obyvatel WHERE Mesto='Brno' GROUP BY Mesto, Ulice; Setřídí se jen 370 tis. záznamů obyvatel Brna SELECT Ulice, COUNT(*) FROM Obyvatel GROUP BY Mesto, Ulice HAVING Mesto='Brno'; Všech 10mil. záznamů se setřídí (zahešuje), ponechají se jen skupiny z Brna DBI026 -DB Aplikace - MFF UK 22

23 Co hlídat při psaní SELECT příkazu
Klauzule DISTINCT třídí (hešuje) výsledné záznamy (ještě před operací ORDER BY), aby našla duplicitní záznamy Pokud to jde, je vhodné se bez DISTINCT obejít Klauzule ORDER BY by měla být použita, jen v nutných případech Není příliš vhodné ji používat v definicích pohledů, nad kterými se dále dělají další dotazy DBI026 -DB Aplikace - MFF UK 23

24 Přehled software pro cvičení
24

25 DBI026 -DB Aplikace - MFF UK
MFF tirpitz.ms.mff… Linux Server tirpitz.ms.mff.cuni.cz Databáze jedenact (11.x) Klienti Linux Laboratoř UW1, UW2 SQL Developer Laboratoř US1, US2 (u-pl*.ms.mff…) jedenact TCP/IP UW1,2 u-pl*.ms.mff… DBI026 -DB Aplikace - MFF UK 25

26 DBI026 -DB Aplikace - MFF UK
MS MFF Laboratoř UW1, UW2 Klienti Win32 MS SQL Server 2008 UW1,2 DBI026 -DB Aplikace - MFF UK 26

27 Vytváření tabulek a pohledů Integritní omezení Aktualizace dat
Relační model SQL Vytváření tabulek a pohledů Integritní omezení Aktualizace dat 27

28 DBI026 -DB Aplikace - MFF UK
Vytváření tabulek CREATE TABLE jm_tab ( jm_sloupce typ [(velikost)] [omezení], …, omezení_řádky, … ); CREATE TABLE Osoba ( rc character(11) CONSTRAINT Osoba_PK PRIMARY KEY, jmeno character(50) NOT NULL ); DBI026 -DB Aplikace - MFF UK 28

29 Reprezentace textových dat
SQL-92 rozlišuje dvoje kódování znaků Důvodem je podpora UTF-8 (UTF-16) Možnost ukládání znaků libovolného jazyka Neefektivní vícebajtová reprezentace znaků pro znaky národních abeced Globální znaková sada, UTF (ne nutně) Národní znaková sada pro texty v jednom konkrétním jazyce - českém, slovenském, … CP-1250, ISO , … DBI026 -DB Aplikace - MFF UK 29

30 Reprezentace textových dat
SQL-92 dále rozlišuje dvojí reprezentaci řetězců Pevná délka, zprava doplněno mezerami Snadnější aktualizace dat Méně efektivní reprezentace Proměnná délka, ukládají se použité znaky plus délka řetězce Efektivnější reprezentace Komplikovanější aktualizace, nová hodnota může zabrat jiný počet bajtů DBI026 -DB Aplikace - MFF UK 30

31 Datové typy dle ANSI SQL-92 1) Textové
CHARACTER(n) text v pevné délce n znaků CHARACTER VARYING(n) CHAR VARYING(n) text v proměnné délce max. n znaků NATIONAL CHARACTER(n) text v pevné délce n znaků v národní abecedě NATIONAL CHARACTER VARYING(n) NATIONAL CHAR VARYING(n) NCHAR VARYING(n) text v proměnné délce max. n znaků v národní abecedě DBI026 -DB Aplikace - MFF UK 31

32 Datové typy dle ANSI SQL-92 1) Textové
Konstanty se uzavírají do apostrofů Apostrof se v konstantách zdvojuje DBI026 -DB Aplikace - MFF UK 32

33 Datové typy dle ANSI SQL-92 2) Číselné
NUMERIC(p[,s]) obecný číselný typ na p platných míst, s cifer za desetinnou čárkou INTEGER, INT, SMALLINT celé číslo FLOAT(b) reálné číslo v b-bitové přesnosti reprezentace REAL reálné číslo DOUBLE PRECISION reálné číslo ve dvojnásobné přesnosti DBI026 -DB Aplikace - MFF UK 33

34 Datové typy dle ANSI SQL-92 3) Datumové
DATE datum (YYYY-MM-DD ) s přesností na dny TIME čas (HH:MM.SS.MMMM) s přesností minimálně na sekundy TIMESTAMP datum plus čas (YYYY-MM-DD HH:MM.SS.MMMM) TIME[STAMP](p) WITH TIMEZONE p udává přesnost sekund, čásová zóna se udává na konci ve tvaru +HH:MM, resp. –HH:MM DBI026 -DB Aplikace - MFF UK 34

35 Datové typy dle ANSI SQL-92 3) Datumové
Konstanty se uzavírají do apostrofů v uvedeném formátu DBI026 -DB Aplikace - MFF UK 35

36 Datové typy dle ANSI SQL-92 vs. reálná DB
Databázové servery Ne vždy podporují všechny uvedené typy Nemusí tyto typy podporovat nativně, pouze si „přeloží“ název typu na podobný nativně podporovaný typ DBI026 -DB Aplikace - MFF UK 36

37 Datové typy dle ANSI SQL-92 vs. Oracle SQL
CHARACTER(n) CHARACTER VARYING(n) CHAR VARYING(n) NATIONAL CHARACTER(n) NATIONAL CHARACTER VARYING(n) NATIONAL CHAR VARYING(n) NCHAR VARYING(n) NUMERIC(p,s) INTEGER, INT, SMALLINT FLOAT(b) DOUBLE PRECISION REAL CHAR(n) VARCHAR2(n) VARCHAR2(n) NCHAR(n) NVARCHAR2(n) NVARCHAR2(n) NVARCHAR2(n) NUMBER(p,s) NUMBER(38) NUMBER NUMBER NUMBER DBI026 -DB Aplikace - MFF UK 37

38 Datové typy dle ANSI SQL-92 vs. Oracle SQL
DATE Přesnost ukládání na sekundy, tj. splňuje požadavky SQL-92 na TIMESTAMP Základní (americký) formát DD-MON-YY např. 01-JAN-2006 VARCHAR2(velikost), //doporučeno VARCHAR(velikost) Řetězec s proměnlivou délkou velikost max znaků (dop. max znaků) DBI026 -DB Aplikace - MFF UK 38

39 DBI026 -DB Aplikace - MFF UK
Integritní omezení [CONSTRAINT jméno] definice_omezení [INITIALLY {DEFERRED|IMMEDIATE}] [[NOT] DEFERRABLE] Pokud omezení není pojmenované, dostane obvykle nic neříkající jméno (V Oracle např. SYS_Cnnnnnn). Doporučuje se proto omezení pojmenovávat Jednotlivá sloupcová omezení se od sebe oddělují mezerou DBI026 -DB Aplikace - MFF UK 39

40 DBI026 -DB Aplikace - MFF UK
Integritní omezení NULL, resp. NOT NULL Sloupec může, resp. nemůže mít nedefinovanou hodnotu NULL. UNIQUE Sloupec musí mít všechny hodnoty různé. Obvykle se používá volnější interpretace: Sloupec musí mít všechny definované hodnoty různé. PRIMARY KEY Sloupec tvoří primární klíč tabulky, je automaticky chápán jako NOT NULL a UNIQUE. DBI026 -DB Aplikace - MFF UK 40

41 DBI026 -DB Aplikace - MFF UK
Integritní omezení CHECK (podmínka) Hodnota sloupce musí splňovat podmínku. REFERENCES tabulka(sloupec) [ON DELETE {CASCADE|SET NULL}] Hodnota odkazuje na primární klíč, nebo kandidátní klíč (UNIQUE sloupec) uvedené tabulky S klauzulí ON DELETE je povoleno mazání nadřízené řádky. Pokud je smazána, podřízená řádka je smazána rovněž, nebo je je hodnota ve sloupci nastavena na NULL DBI026 -DB Aplikace - MFF UK 41

42 DBI026 -DB Aplikace - MFF UK
Integritní omezení DEFAULT hodnota Defaultní hodnota, pokud není uvedeno jinak Standardně je DEFAULT NULL DBI026 -DB Aplikace - MFF UK 42

43 DBI026 -DB Aplikace - MFF UK
Integritní omezení Příklad CREATE TABLE Osoba( RC CHARACTER(11) CONSTRAINT Osoba_PK PRIMARY KEY, JMENO CHAR VARYING(30) CONSTRAINT Osoba_U_Jmeno UNIQUE NOT NULL, CHAR VARYING(30) CONSTRAINT Osoba_C_ CHECK ( LIKE ); DBI026 -DB Aplikace - MFF UK 43

44 Datový slovník v Oracle / MS SQL
Informace o tabulkách jsou v Oracle uloženy v pohledech USER_TABLES USER_TAB_COLUMNS USER_CONSTRAINTS Informace o tabulkách jsou v MS SQL uloženy v pohledech INFORMATION_SCHEMA .TABLES INFORMATION_SCHEMA .COLUMNS INFORMATION_SCHEMA .TABLE_CONSTRAINTS DBI026 -DB Aplikace - MFF UK 44

45 Řádková integritní omezení
Mohou kontrolovat vzájemný vztah více sloupců jednoho řádku CHECK (zacatek <= konec) Mohou definovat vícesloupcové primární a kandidátní a cizí klíče PRIMARY KEY (zacatek, konec) FOREIGN KEY (zacatek, konec) REFERENCES Rodic (x, y) DBI026 -DB Aplikace - MFF UK 45

46 Atributy integritních omezení
ENABLED / DISABLED Omezení je aktivní a platnost se ověřuje ALTER TABLE tabulka {ENABLE|DISABLE} CONSTRAINT omezení; DEFERRED / IMMEDIATE Ověření se odloží na konec transakce, jinak se ověřuje okamžitě DEFERRABLE / NOT DEFERRABLE Ověření je / není možné odkládat na konec transakce DBI026 -DB Aplikace - MFF UK 46

47 Na co si dát při návrhu pozor
Hlídat na úrovni databáze všechny manipulace s daty, které ohlídat jdou Cokoli jde zadat uživatelem špatně, bude zadáno špatně Integritní omezení, triggery Později je čištění nekonzistentních dat namáhavé a opravy často nemožné Lépe ohlídat vše centrálně, než v každé aplikaci zvlášť DBI026 -DB Aplikace - MFF UK 47

48 Na co si dát při návrhu pozor
Hlídat unikátnost vkládaných dat Každá tabulka by měla mít primární klíč I v případě, kdy je primární klíč uměle vytvořený, jednotlivé instance (řádky) obvykle mívají svůj přirozený jedno- či vícesloupcový identifikátor, který by měl být definován jako alternativní klíč tabulky (UNIQUE) Nezřídka existuje více alternativních klíčů DBI026 -DB Aplikace - MFF UK 48

49 INSERT/UPDATE/DELETE Vestavěné funkce
#INCLUDE dbacv_01.ppt INSERT/UPDATE/DELETE Vestavěné funkce 49

50 Změna schématu aplikace
Přednáška č. 2 Změna schématu aplikace Přidávání a odebírání sloupců a omezení Změna definice sloupců a omezení 50

51 Proč měnit schéma aplikace
Chyba v návrhu Špatná normální forma aplikace Nelze uložit všechna požadovaná data Chybně definovaná kontrola Změna požadavků ze strany zákazníka Podpora nových vlastností evidovaných entit Změna v omezeních DBI026 -DB Aplikace - MFF UK 51

52 Na co při změnách schématu nezapomenout
Změny schématu a aplikace představují obvykle výraznou většinu životního cyklu aplikace Data evidovaná ve schématu mají větší cenu, než použitý software a hardware Schopnost změny schématu aplikace a modifikace dat bez jejich ztráty je důležitější, než vytváření schématu zcela nového DBI026 -DB Aplikace - MFF UK 52

53 DBI026 -DB Aplikace - MFF UK
Změna definic tabulek Přidání sloupce do již existujících tabulek ALTER TABLE tabulka ADD definice sloupce; Př. ALTER TABLE Osoba ADD Poznamka CHARACTER VARYING(1000); ALTER TABLE Vyrobek ADD EAN NUMERIC(13) CONSTRAINT Vyrobek_U_EAN UNIQUE; DBI026 -DB Aplikace - MFF UK 53

54 DBI026 -DB Aplikace - MFF UK
Změna definic tabulek Zrušení sloupce v již existující tabulce Před zrušením je obvykle nutné data přesunout na nové místo! ALTER TABLE tabulka DROP COLUMN sloupec; Př. ALTER TABLE Osoba DROP COLUMN Psc; DBI026 -DB Aplikace - MFF UK 54

55 DBI026 -DB Aplikace - MFF UK
Změna definic tabulek Přidání omezení do již existujících tabulek ALTER TABLE tabulka ADD definice omezení; Př. ALTER TABLE Osoba ADD CONSTRAINT Osoba_FK_Matka FOREIGN KEY(matka) REFERENCES Osoba(ID) ON DELETE SET NULL; DBI026 -DB Aplikace - MFF UK 55

56 DBI026 -DB Aplikace - MFF UK
Změna definic Zrušení nadbytečného omezení v tabulce ALTER TABLE tabulka DROP CONSTRAINT omezení; Př. ALTER TABLE Osoba DROP CONSTRAINT Osoba_U_Jmeno; DBI026 -DB Aplikace - MFF UK 56

57 DBI026 -DB Aplikace - MFF UK
Změna definic tabulek Sloupce a omezení lze přidávat najednou příkazem ALTER TABLE tabulka ADD ( definice sloupce | omezení, … ); Př. ALTER TABLE Osoba ADD ( Poznamka CHARACTER VARYING(1000), CONSTRAINT Osoba_Chk_Vek CHECK (Vek>=0) ); DBI026 -DB Aplikace - MFF UK 57

58 DBI026 -DB Aplikace - MFF UK
Změna definic tabulek Sloupce lze redefinovat příkazem ALTER TABLE tabulka MODIFY ( nová definice sloupce, … ); Př. ALTER TABLE Osoba MODIFY ( Poznamka CHARACTER VARYING(2000) ); Lze měnit NULL na NOT NULL a naopak Šířku sloupce Zvětšení Zmenšení (pokud je sloupec prázdný) DBI026 -DB Aplikace - MFF UK 58

59 Spojování tabulek v SELECT příkazu
59

60 DBI026 -DB Aplikace - MFF UK
Spojování tabulek Norma SQL-92 zavedla více typů spojování tabulek v klauzuli WHERE včetně podmínek Kartézský součin Spojení Přirozené spojení Vnější spojení Předchozí normy dovolovaly pouze čárkami oddělený seznam zdrojů (tabulek a pohledů) u každého zdroje bylo možné uvést alias, oddělený mezerou podmínky spojení výhradně v klauzuli WHERE DBI026 -DB Aplikace - MFF UK 60

61 DBI026 -DB Aplikace - MFF UK
Spojování tabulek ANSI SQL-92 syntaxe dovoluje použití klíčového slova AS pro oddělení definice aliasu od zdroje dat … FROM Emp AS E, Dept AS D Rozlišuje jednotlivé způsoby spojení pomocí dalších klíčových slov Uvádí podmínky spojení v klauzuli FROM Klauzule WHERE slouží pro uvedení dodatečných podmínek (selekci) DBI026 -DB Aplikace - MFF UK 61

62 DBI026 -DB Aplikace - MFF UK
Spojování tabulek 1111 10 2222 20 EmpNo DeptNo X CROSS JOIN Y kartézský součin ekvivalent předchozího stylu zápisu X, Y SELECT EmpNo, Loc FROM Emp CROSS JOIN Dept; 20 NEW YORK 30 DALLAS DeptNo Loc 1111 10 EmpNo DeptNo 20 NEW YORK 30 DALLAS Loc 2222 DBI026 -DB Aplikace - MFF UK 62

63 DBI026 -DB Aplikace - MFF UK
Spojování tabulek 1111 10 2222 20 EmpNo DeptNo X NATURAL [INNER] JOIN Y přirozené spojení přes všechny společné sloupce tabulek SELECT EmpNo, Loc FROM Emp NATURAL JOIN Dept; 20 NEW YORK 30 DALLAS DeptNo Loc EmpNo DeptNo Loc 2222 20 NEW YORK DBI026 -DB Aplikace - MFF UK 63

64 Spojování tabulek Oracle vs. ANSI SQL-92
X [INNER] JOIN Y ON (podmínka) standardní spojení tabulek, ekvivalent zápisu FROM … X, Y … WHERE podmínka X [INNER] JOIN Y USING (sloupce) standardní spojení přes rovnost uvedených sloupců (v obou tabulkách se musí jmenovat shodně) DBI026 -DB Aplikace - MFF UK 64

65 Vnější spojování tabulek
Místo INNER je možné uvést jednu z možností LEFT [OUTER], RIGHT [OUTER], FULL [OUTER] Pokud je uvedeno … X LEFT JOIN Y ON (podmínka) ... Jsou ve výsledku všechny řádky levé tabulky (X), i když k nim neexistuje žádná odpovídající řádka z pravé tabulky (Y) DBI026 -DB Aplikace - MFF UK 65

66 Vnější spojování tabulek
Místo INNER je možné uvést jednu z možností LEFT [OUTER], RIGHT [OUTER], FULL [OUTER] SELECT * FROM Emp NATURAL LEFT JOIN Dept; Ve výsledku jsou uvedeni i zaměstnanci, kteří nejsou v žádném oddělení Neexistující položky z oddělení jsou vyplněny NULL hodnotami 1111 10 EmpNo DeptNo Loc 2222 20 NEW YORK DBI026 -DB Aplikace - MFF UK 66

67 Vnější spojování tabulek
Místo INNER je možné uvést jednu z možností LEFT [OUTER], RIGHT [OUTER], FULL [OUTER] SELECT * FROM Emp NATURAL RIGHT JOIN Dept; Ve výsledku jsou uvedena i oddělení, ve kterých nejsou žádní zaměstnanci Neexistující položky z oddělení jsou vyplněny NULL hodnotami 2222 20 EmpNo DeptNo Loc 30 DALLAS NEW YORK DBI026 -DB Aplikace - MFF UK 67

68 Vnější spojování tabulek
Místo INNER je možné uvést jednu z možností LEFT [OUTER], RIGHT [OUTER], FULL [OUTER] SELECT * FROM Emp NATURAL FULL JOIN Dept; Kombinace NATURAL LEFT OUTER JOIN a NATURAL RIGHT OUTER JOIN zároveň 1111 10 EmpNo DeptNo Loc 2222 20 NEW YORK 30 DALLAS DBI026 -DB Aplikace - MFF UK 68

69 Vnější spojování tabulek v Oracle
Oracle má i svoji nativní syntaxi pro vnější spojení Starší, pouze pro rovnost hodnot sloupců Použití ANSI SQL je silnější a přenositelné Levé vnější spojení SELECT * FROM Dept, Emp WHERE Dept.Deptno = Emp.Deptno(+); Pravé vnější spojení SELECT * FROM Dept, Emp WHERE Dept.Deptno(+) = Emp.Deptno; Oboustranné neexistuje DBI026 -DB Aplikace - MFF UK 69

70 Optimalizace SQL dotazů
Indexy Plány provedení dotazu Ovlivnění optimalizátoru 70

71 DBI026 -DB Aplikace - MFF UK
Indexy Slouží pro zrychlení přístupu k datům na základě podmínky ve WHERE klauzuli Nemění syntaxi ani sémantiku příkazů pro manipulaci s daty Unikátní vs. neunikátní Jednosloupcové vs. vícesloupcové B-stromy vs. bitmapy Nad sloupci vs. nad výrazy Doménové indexy (fulltextové, prostorové, …) DBI026 -DB Aplikace - MFF UK 71

72 DBI026 -DB Aplikace - MFF UK
Indexy Tvorba indexů není v SQL-92 standardizována Jednotlivé databázové systémy řeší tvorbu indexů svými prostředky, které jsou navzájem více či méně podobné Může se lišit syntaxe podpora různých typů indexů jejich (ne)použití pro daný dotaz a obsah tabulky DBI026 -DB Aplikace - MFF UK 72

73 DBI026 -DB Aplikace - MFF UK
B-tree indexy Obvykle redundantní B+ stromy Hodnoty v listech Listy oboustranně linkované pro snadný sekvenční průchod. Vhodné pro sloupce s vysokou selektivitou (počtem různých hodnot ve sloupci). Vícesloupcové (složené) indexy mohou zvýšit selektivitu. Použitelné, pokud dotaz omezuje hodnoty prvních k sloupců indexu, přičemž prvních k-1 sloupců musí být omezeno na rovnost Nepoužitelné, pokud v dotazu není omezení na první sloupec indexu Nad jednou tabulkou v jednom dotazu nelze obvykle kombinovat více B-tree indexů. Dotaz se vyhodnocuje s použitím jednoho z indexů a ostatní podmínky se dopočítávají DBI026 -DB Aplikace - MFF UK 73

74 DBI026 -DB Aplikace - MFF UK
Bitmapové indexy Pro každou hodnotu sloupce / výrazu vytvořen binární řetězec obsahující 1 právě pro řádky s danou hodnotou Vhodné pro sloupce s nízkou selektivitou Lze kombinovat více bitmapových indexů nad jednou tabulkou pro zvýšení selektivity Kombinací více bitmap se zvyšuje selektivita indexu SELECT * FROM Obyvatel WHERE Pohlaví=’M’ AND (Kraj=’Pha’ OR Kraj=’SČ’); Kombinace tří bitmapových řetězců 1 M P h a S Č ( )= DBI026 -DB Aplikace - MFF UK 74

75 Kdy indexy (ne)pomohou
Pokud je procento vyhovujících záznamů velké zvýšená režie s přístupem k řádkům v nesekvenčním pořadí, daném indexem Při dotazech na hodnotu NULL v indexech se běžně neukládají Pomohou V dotazech na rovnost sloupce s konstantou V dotazech na náležení hodnoty do intervalu DBI026 -DB Aplikace - MFF UK 75

76 Kdy (ne)vytvářet indexy
Jak Oracle, tak MS SQL vytváří automaticky unikátní indexy pro primární klíče jméno bývá shodné se jménem omezení kandidátní klíče (UNIQUE sloupce) DBI026 -DB Aplikace - MFF UK 76

77 Kdy (ne)vytvářet indexy
Důležité je vytvářet indexy pro cizí klíče !!! Zrychlení odezvy při manipulaci s nadřízenou tabulkou Při rušení nadřízené řádky je bez indexu nutné projít celou podřízenou tabulku, zda neobsahuje závislé řádky Pokud je aktivované kaskádové mazání a odkazy jsou víceúrovňové, pro každou nalezenou podřízenou řádku je nutné projít celou její pořízenou tabulku atd. atd. Průchod tabulkou čte i bloky, obsahující zrušené záznamy v tabulce Průchod přes index najde efektivně všechny existující závislé řádky bez nutnosti čtení samotné tabulky Např. Oracle řeší nemožnost efektivně najít a zamknout podřízené řádky zamknutím celé podřízené tabulky, čímž velmi omezuje možnost běhu aplikace s více uživateli. DBI026 -DB Aplikace - MFF UK 77

78 Kdy (ne)vytvářet indexy
Indexy by se jinak měly vytvářet jen v případě, pokud výrazně pomohou často kladeným dotazům V opačném případě spíše zdržují aktualizační operace DBI026 -DB Aplikace - MFF UK 78

79 DBI026 -DB Aplikace - MFF UK
Indexy Indexy nad sloupci CREATE [UNIQUE] INDEX jméno_indexu ON jméno_tabulky(sloupec1, sloupec2, …); Př. CREATE INDEX Osoba_Pr_Jm_Inx ON Osoba(Prijmeni,Jmeno); Index lze použít v příkazu, omezujícím první použitý sloupec SELECT * From Osoba WHERE Prijmeni=’Svoboda’; DBI026 -DB Aplikace - MFF UK 79

80 DBI026 -DB Aplikace - MFF UK
Indexy Indexy nad sloupci CREATE [UNIQUE] INDEX jméno_indexu ON jméno_tabulky(sloupec1, sloupec2, …); Př. CREATE INDEX Osoba_Pr_Jm_Inx ON Osoba(Prijmeni,Jmeno); Index nelze použít v příkazu, omezujícím jen druhý použitý sloupec SELECT * From Osoba WHERE Jmeno=’Zdeněk’; DBI026 -DB Aplikace - MFF UK 80

81 DBI026 -DB Aplikace - MFF UK
Unikátní indexy Vhodnější je definovat unikátnost pomocí integritních omezení PRIMARY KEY a UNIQUE Kromě unikátních indexů jsou tak definována i samotná omezení DBI026 -DB Aplikace - MFF UK 81

82 DBI026 -DB Aplikace - MFF UK
Indexy Indexy s definicí třídění CREATE [UNIQUE] INDEX jméno_indexu ON jméno_tabulky(sloupec1 [{ASC|DESC}], …); Definují směr třídění v jednotlivých sloupcích Mohou pomoci určit výsledné pořadí záznamů bez provádění třídících operací během SELECT příkazu Př. CREATE INDEX Zamestnanec_Zarazeni_Plat_Inx ON Zamestnanec(Zarazeni, Plat DESC); DBI026 -DB Aplikace - MFF UK 82

83 DBI026 -DB Aplikace - MFF UK
Bitmapové indexy Bitmapové indexy (jsou vždy neunikátní) CREATE BITMAP INDEX jméno_indexu ON jméno_tabulky({sloupec1|výraz1}, …); Př. CREATE BITMAP INDEX Vyuka_Den_Inx ON Vyuka(DenVTydnu); DBI026 -DB Aplikace - MFF UK 83

84 CLUSTERED vs. NONCLUSTERED indexy
Nejvýše jeden – defaultně primární klíč Pokud existuje Data v tabulce tříděna dle sloupců indexu (ISF) Ostatní indexy odkazují na hodnoty těchto sloupců Pokud neexistuje Data v tabulce netříděná (HEAP) Ostatní indexy odkazují na řádky NONCLUSTERED DBI026 -DB Aplikace - MFF UK 84

85 CLUSTERED vs. NONCLUSTERED indexy
create table nahalde( id numeric(5) identity (100,10) constraint nahalde_pk primary key NONCLUSTERED, nazev character varying(10) constraint nahalde_u_nazev unique ); select object_id, name, index_id iid, type typ, type_desc from sys.indexes; object_id | name |iid|typ| type_desc | kategorie_pk | 1 | 1 | CLUSTERED | kategorie_u_naz| 2 | 2 | NONCLUSTERED | NULL | 0 | 0 | HEAP | nahalde_u_nazev| 2 | 2 | NONCLUSTERED | nahalde_pk | 3 | 2 | NONCLUSTERED DBI026 -DB Aplikace - MFF UK 85

86 DBI026 -DB Aplikace - MFF UK
Index Oranized Tables Obdoba CLUSTERED u MS SQL Tabulka setříděná dle primárního klíče, celé řádky tvoří listovou úroveň indexu Ostatní indexy obsahují tzv. logické ROWID Primární klíč + předpokládanou adresu CREATE TABLE Osoba( RC VARCHAR2(11) CONSTRAINT Osoba_PK PRIMARY KEY, … ) ORGANIZATION INDEX; DBI026 -DB Aplikace - MFF UK 86

87 DBI026 -DB Aplikace - MFF UK
Indexy Zrušení indexu ORACLE: DROP INDEX jméno_indexu; MSSQL: DROP INDEX tabulka.jméno_indexu; DBI026 -DB Aplikace - MFF UK 87

88 DBI026 -DB Aplikace - MFF UK
Datový slovník Informace o indexech jsou v Oracle uloženy v pohledech USER_INDEXES USER_IND_COLUMNS Informace o indexech jsou v MS SQL uloženy v pohledech INFORMATION_SCHEMA .INDEXES DBI026 -DB Aplikace - MFF UK 88

89 Na co si dát při návrhu pozor
Používat správné typy indexů Negenerovat bez uvážení indexy pro všechny sloupce tabulky a jejich kombinace Zdržují se aktualizace dat Zvyšuje se nárok na diskový prostor DBI026 -DB Aplikace - MFF UK 89

90 Na co si dát při návrhu pozor
Při návrhu dotazů využívat prostředky daného serveru pro zjištění té nejlepší varianty dotazu ovlivnění způsobu vyhodnocení dotazu Optimalizátory databází mají své meze pro nalezení optimálního plánu se používají heuristické postupy Neuvažují se zdaleka všechny kombinace pořadí tabulek a indexů DBI026 -DB Aplikace - MFF UK 90

91 DBI026 -DB Aplikace - MFF UK
Optimalizace dotazů Jeden dotaz lze napsat více způsoby Shodná sémantika Rozdílný způsob výpočtu výsledku Doba výpočtu se může lišit i řádově !! O způsobu výpočtu rozhoduje optimalizátor uvnitř databázového serveru Potřebné je Umět zjistit, jakým způsobem výpočet proběhne Zvolit nejlépe optimalizovatelný zápis dotazu nebo optimalizátoru pomoci s výběrem DBI026 -DB Aplikace - MFF UK 91

92 Co obsahuje plán provedení
Strom elementárních operací Vyhodnocuje se post-order metodou, operace v kořeni získá celý požadovaný výsledek Nástin obsahu plánu V listech přístupy ke zdrojům Index UNIQUE SCAN Index RANGE SCAN Table FULL SCAN Ve vnitřních uzlech Přístupy k řádku tabulky podle indexu Spojení tabulek (vnořené cykly, MERGE JOIN, HASH JOIN) Třídící operace Filtry dle dodatečných podmínek DBI026 -DB Aplikace - MFF UK 92

93 DBI026 -DB Aplikace - MFF UK
Typy optimalizace V Oracle Starší RULE BASED optimalizace (RBO) Odvozuje plán ze syntaxe příkazu a existence indexů Novější COST BASED optimalizace (CBO) Oracle 8+, doporučována pro lepší vlastnosti Založena na statistikách, počítá cenu zdrojů provedení operace (čas, prostor, třídící operace, …) Dokáže rozlišit plány i pro různé hodnoty konstant v dotazu DBI026 -DB Aplikace - MFF UK 93

94 Rule-Based Optimalizace dotazů
Cena přístupu k podmnožině řádek v tabulce v klesajícím pořadí Full-scan Prochází se celá tabulka, u každé řádky se ověří podmínka Může být vhodné, pokud procento vyhovujících řádek je dost velké Index-Range-Scan Vyhledání intervalu v indexu, ověření ostatních podmínek v odkazovaných řádcích Unique-Index-Scan Vyhledání jediné možné vyhovující řádky podle unikátního indexu ROWID-Scan Vyhledání řádky na základě známé hodnoty jejího fyzického identifikátoru v databázi DBI026 -DB Aplikace - MFF UK 94

95 DBI026 -DB Aplikace - MFF UK
Optimalizace dotazů Cena operace JOIN dvou tabulek Databáze se snaží zvolit tabulku s dražším přístupem jako hlavní tabulku Ke každé nalezené vyhovující řádce dohledává odpovídající řádky ve druhé tabulce Pokud obě tabulky nabízí pouze Full-Scan, data obou se setřídí a provede se Merge-Join DBI026 -DB Aplikace - MFF UK 95

96 DBI026 -DB Aplikace - MFF UK
Optimalizace dotazů Jak zjistit způsob provedení příkazu? Nejprve je nutné mít tabulku PLAN_TABLE s odpovídající strukturou, do které plánovač ukládá informace o plánu provedení SQL*Plus nabízí přepínač SET AUTOTRACE {OFF|ON|TRACEONLY} Oracle obsahuje příkaz EXPLAIN PLAN DBI026 -DB Aplikace - MFF UK 96

97 DBI026 -DB Aplikace - MFF UK
Tabulka PLAN_TABLE Zajímavé sloupce STATEMENT_ID VARCHAR2(30) OPERATION VARCHAR2(30) OPTIONS VARCHAR2(30) OBJECT_OWNER VARCHAR2(30) OBJECT_NAME VARCHAR2(30) OBJECT_TYPE VARCHAR2(30) ID NUMBER(38) PARENT_ID NUMBER(38) COST NUMBER(38) … Identifikátor příkazu, shodný pro všechny řádky plánu Operace (SCAN, SORT, …) Upřesnění operace (FULL, RANGE, UNIQUE, …) Vlastník zdroje Jméno zdroje Typ zroje (TABLE, INDEX, CLUSTER, …) Identifikace kroku v plánu s daným STATEMENT_ID Identifikace rodičovského kroku ve stromu provedení Odhadovaná cena … Strom plánu se čte od listů ke kořeni Rodičovská operace se provádí po dokončení operací v potomcích Kořenová operace má ID=0 DBI026 -DB Aplikace - MFF UK 97

98 DBI026 -DB Aplikace - MFF UK
Příkaz EXPLAIN PLAN EXPLAIN PLAN SET STATEMENT_ID = ’jméno’ [INTO tabulka] FOR příkaz; EXPLAIN PLAN SET STATEMENT_ID = ’emp_dept’ FOR SELECT Emp.*, Dept.Loc FROM Dept, Emp WHERE Dept.DeptNo = Emp.Deptno; DBI026 -DB Aplikace - MFF UK 98

99 DBI026 -DB Aplikace - MFF UK
Příkaz EXPLAIN PLAN Získání plánu provedení – a) vlastním příkazem SELECT LPad(' ',2*Level-1)||operation ||' '||options ||' '||object_name AS text FROM Plan_Table START WITH Statement_ID=’příkaz’ AND ID = 0 CONNECT BY Parent_ID = PRIOR ID AND Statement_ID = PRIOR Statement_ID; DBI026 -DB Aplikace - MFF UK 99

100 DBI026 -DB Aplikace - MFF UK
Příkaz EXPLAIN PLAN Získání plánu provedení – b) příkazem (verze 10+) select plan_table_output from table( dbms_xplan.display( 'PLAN_TABLE',{statement_id|null}, {'ALL'|'TYPICAL'|'BASIC'|'SERIAL'} ) ); PLAN_TABLE_OUTPUT | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| | 0 | SELECT STATEMENT | | | 1893K| (2)| | 1 | NESTED LOOPS | | | 1893K| (2)| | 2 | INDEX RANGE SCAN | MF_CISPOLATR_SK_ATR_DO_PBCP | | | (0)| | 3 | COLLECTION ITERATOR PICKLER FETCH| XMLSEQUENCEFROMXMLTYPE | | | | DBI026 -DB Aplikace - MFF UK 100

101 DBI026 -DB Aplikace - MFF UK
Optimalizace dotazů Jak zjistit způsob provedení příkazu? Např. konzola ISQL nabízí možnost zobrazit textově plán provedení příkazu sekvencí příkazů set showplan_text on go <příkaz> go DBI026 -DB Aplikace - MFF UK 101

102 DBI026 -DB Aplikace - MFF UK
Query Analyzer Grafická reprezentace plánu provedení Vložení příkazu Stisk CTRL+L DBI026 -DB Aplikace - MFF UK 102

103 Jak psát optimalizovatelné dotazy
Obvyklá rada: v aplikacích používat místo konstant tzv. placeholdery a aplikační proměnné Dva „různé“ dotazy mají dva samostatné, i když shodné, plány provedení. Jejich vytvoření zabírá čas a jiné zdroje databáze SELECT * FROM Emp WHERE DeptNo=10; SELECT * FROM Emp WHERE DeptNo=20; SELECT * FROM Emp WHERE DeptNo=:d; Někdy ovšem mohou dva plány, získané s využitím CBO pomoci, (pokud se princip provedení odůvodněně liší). SELECT * FROM Vojaci WHERE Pohlavi=’M’ SELECT * FROM Vojaci WHERE Pohlavi=’Ž’ 90% dat (full s.) 10% dat (range s.) DBI026 -DB Aplikace - MFF UK 103

104 Jak psát optimalizovatelné dotazy
Jeden dotaz psát všude přesně stejně Různé zápisy databáze vždy znovu analyzuje a vymýšlí plán provedení SELECT * FROM Emp WHERE Ename LIKE ’A%’ AND DeptNo=10; SELECT * FROM Emp WHERE DeptNo=10 AND Ename LIKE ’A%’; DBI026 -DB Aplikace - MFF UK 104

105 Nevýhody rule-based optimalizace
Pokud existuje více neunikátních indexů na jedné tabulce, nemusí (RBO) optimalizátor vybrat ten nejlepší SELECT * FROM Osoba WHERE Jmeno=’Jan’ AND Mesto=’Praha’; Buďto se přes index hledají Janové, a ověřuje se bydliště, nebo se hledají Pražáci a ověřuje se jméno DBI026 -DB Aplikace - MFF UK 105

106 Nevýhody rule-based optimalizace
Použití určitého indexu je možné optimalizátoru znemožnit použitím (i neutrálního) výrazu v dotazu SELECT * FROM Osoba WHERE CONCAT(Jmeno,’’)=’Jan’ AND Mesto=’Praha’; Index přes jméno nelze použít, použije se tedy index přes město Pozn.: sofistikovanější optimalizátor by mohl takovéto „úpravy“ odhalit a dotaz přepsat DBI026 -DB Aplikace - MFF UK 106

107 Cost-based optimalizace
Pro jednotlivé plány se počítá cena provedení v řadě hledisek Množství I/O operací, řádek, Byte, … Cena prováděných třídících operací Cena za HASH operace Vybírá se plán s nejnižší váženou cenou DBI026 -DB Aplikace - MFF UK 107

108 Cost-based optimalizace
Využívá statistických informací o datech Počet různých hodnot ve sloupci, Histogramy rozložení hodnot ve sloupci, Počet řádek v tabulce, Průměrná délka jedné řádky Pro konkrétní hodnotu nebo interval hodnot lze odhadnout procento vyhovujících řádek v tabulce jejich datový objem DBI026 -DB Aplikace - MFF UK 108

109 Cost-based optimalizace
V Oracle CBO dovoluje používat indexy přes výrazy (RBO je nepodporuje) CREATE INDEX Emp_Income_INX ON Emp(Sal+COALESCE(Comm,0)); Dotaz se shodným zápisem výrazu může index použít SELECT EName FROM Emp WHERE Sal+COALESCE(Comm,0) > 25000; Dotaz s upraveným zápisem index použít nedokáže SELECT EName FROM Emp WHERE COALESCE(Comm,0)+Sal > 25000; DBI026 -DB Aplikace - MFF UK 109

110 Výběr typu optimalizace
Výběr optimalizace ALTER SESSION SET OPTIMIZER_MODE*) = CHOOSE – výběr podle (ne)přítomnosti statistik nejsou-li k dispozici, potom RBO, jinak CBO ALL_ROWS – vždy CBO, minimalizuje se cena za získání všech řádek odpovědi Vhodné pro dávkové zpracování. FIRST_ROWS – vždy CBO, minimalizuje se cena za získání prvních řádek odpovědi. Vhodné pro interaktivní zpracování. RULE – vždy RBO *) Pozn.: Starší syntaxe: OPTIMIZER_GOAL DBI026 -DB Aplikace - MFF UK 110

111 DBI026 -DB Aplikace - MFF UK
Tvorba statistik ANALYZE TABLE jm_tabulky {COMPUTE | ESTIMATE | DELETE} STATISTICS [FOR {TABLE | ALL [INDEXED] COLUMNS}]; DBMS_UTILITY.ANALYZE_SCHEMA( ’jm_schematu’,{’compute’ | ’delete’ | ’estimate’} ); DBMS_STATS.GATHER_SCHEMA_STATS(’jm_sch’); Pohledy v datovém slovníku INDEX_STATS, USER_TAB_COL_STATISTICS USER_USTATS DBI026 -DB Aplikace - MFF UK 111

112 DBI026 -DB Aplikace - MFF UK
Tvorba statistik Standardně povolen přepínač AUTO_CREATE_STATISTICS Statistiky se generují automaticky ALTER DATABASE dbname SET AUTO_CREATE_STATISTICS {ON|OFF} Ručně pomocí sp_createstats Př. vytvoření dodatečné statistiky pro dvousloupcovou hodnotu na základě vzorku dat CREATE STATISTICS FirstLast ON Person.Contact(FirstName,LastName) WITH SAMPLE 50 PERCENT DBI026 -DB Aplikace - MFF UK 112

113 Co statistiky obsahují
Tabulky Počet řádek Počet datových bloků na řádku Sloupce Počet různých hodnot Počet NULL hodnot Histogramy hodnot (kolik hodnot připadne do daného intervalu) DBI026 -DB Aplikace - MFF UK 113

114 Nápověda optimalizátoru (hinty)
Pomocí plusových komentářů bezprostředně za prvním klíčovým slovem příkazu SELECT/UPDATE/INSERT/DELETE SELECT --+ seznam hintů SELECT /*+ seznam hintů */ Možné použít pro volbu typu optimalizace SELECT /*+ RULE */ * FROM EMP …; SELECT /*+ FIRST_ROWS */ * FROM EMP …; Použití hintu (kromě RULE) vždy použije CBO na základě statistik. Pokud nejsou statistiky spočteny, výsledek optimalizace je kontraproduktivní. DBI026 -DB Aplikace - MFF UK 114

115 Nápověda optimalizátoru (hinty)
Základní nastavení optimalizátoru CHOOSE Optimalizátor vybere metodu dle přítomnosti/nepřítomnosti statistik RULE Optimalizátor použije optimalizaci založenou na pravidlech i v případě, že má k dispozici statistiky ALL_ROWS Optimalizátor se bude snažit minimalizovat cenu za zpracování všech řádek v dotazu či příkazu FIRST_ROWS, FIRST_ROWS(n) Optimalizátor bude minimalizovat cenu za získání první, resp. prvních n řádek DBI026 -DB Aplikace - MFF UK 115

116 Nápověda optimalizátoru (hinty)
Další možnosti (výběr dat z tabulek) FULL(jm_tabulky) Full-scan pro tabulku INDEX (jm_tabulky jm_indexu) Pro průchod tabulkou se použije požadovaný index NO_INDEX (jm_tabulky jm_indexu) Pro průchod tabulkou se nepoužije požadovaný index ORDERED Při spojování tabulek se použije pořadí uvedené ve FROM USE_NL, USE_MERGE, USE_HASH Spojení pomocí vnořených cyklů, merge-join, hash-join DBI026 -DB Aplikace - MFF UK 116

117 Nápověda optimalizátoru (hinty)
FULL(jm_tabulky) SELECT /*+ FULL(Emp) */ EmpNo, Ename FROM Emp WHERE EName>’X’; Použít FULL SCAN i přes případně malé procento vracených řádek Pokud má tabulka alias, je v hintu tento alias, to dovoluje mít v dotazu jednu tabulku vícekrát a nápovědu cílit na konkrétní výskyt DBI026 -DB Aplikace - MFF UK 117

118 Nápověda optimalizátoru (hinty)
INDEX(jm_tabulky index [index …]) SELECT --+ INDEX(Emp ENameInx EDeptInx) EmpNo, Ename FROM Emp WHERE EName LIKE’SC%’ AND DeptNo>50; Použít ten z uvedených indexů, který nabízí nejnižší cenu provedení operace a ostatní případné indexy nad tabulkou neuvažovat DBI026 -DB Aplikace - MFF UK 118

119 Nápověda optimalizátoru (hinty)
NO_INDEX(jm_tabulky index [index …]) SELECT --+ NO_INDEX(Emp ENameInx) EmpNo, Ename FROM Emp WHERE EName LIKE’SC%’ AND DeptNo>50; Index přes EName se nebude pro vytvoření plánu uvažovat DBI026 -DB Aplikace - MFF UK 119

120 Nápověda optimalizátoru (hinty)
ORDERED SELECT --+ ORDERED EmpNo, Ename FROM Emp, Dept WHERE …; Tabulky se budou spojovat v pořadí, v jakém jsou uvedené ve FROM klauzuli Při plánování ušetří čas, jinak nutný pro další možná pořadí spojování DBI026 -DB Aplikace - MFF UK 120

121 Nápověda optimalizátoru (hinty)
SELECT … OPTION (hint …); Hintem může být: { { HASH | ORDER } GROUP { CONCAT | HASH | MERGE } UNION    { LOOP | MERGE | HASH } JOIN | FAST number_rows | FORCE ORDER | MAXDOP number_of_processors | OPTIMIZE FOR ( @variable_name { UNKNOWN | = literal_constant } [ , ...n ] ) | … DBI026 -DB Aplikace - MFF UK 121

122 Nápověda optimalizátoru (hinty)
{ { HASH | ORDER } GROUP Způsob realizace GROUP BY operace { CONCAT | HASH | MERGE } UNION Způsob realizace spojení výsledku dvou SELECT příkazů s vynecháním duplicit { LOOP | MERGE | HASH } JOIN Způsob realizace spojování tabulek FAST number_rows Dotaz optimalizován na rychlé získání prvních number_rows řádek DBI026 -DB Aplikace - MFF UK 122

123 Nápověda optimalizátoru (hinty)
FORCE ORDER Zachování pořadí spojování tabulek tak, jak jsou v SELECTu MAXDOP number_of_processors Omezení maximálního stupně paralelismu v dotazu OPTIMIZE FOR ( @variable_name { UNKNOWN | = literal_constant } [ , ...n ] ) Pokud příkaz obsahuje proměnnou, předpokládá se nějaká konkrétní hodnota, nebo naopak neznámá hodnota DBI026 -DB Aplikace - MFF UK 123

124 Nápověda optimalizátoru (hinty)
FORCE ORDER Zachování pořadí spojování tabulek tak, jak jsou v SELECTu MAXDOP number_of_processors Omezení maximálního stupně paralelismu v dotazu OPTIMIZE FOR ( @variable_name { UNKNOWN | = literal_constant } [ , ...n ] ) Pokud příkaz obsahuje proměnnou, předpokládá se nějaká konkrétní hodnota, nebo naopak neznámá hodnota DBI026 -DB Aplikace - MFF UK 124

125 #INCLUDE dbacv_02.ppt #INCLUDE dbacv_03.ppt
Optimalizace Příklady 125

126 Přednáška č. 3 Pohledy 126

127 Pohledy nad relačními tabulkami
Pohled ~ pojmenovaný SELECT příkaz Reprezentuje virtuální tabulku Při dotazu nad pohledem se pohled vždy znovu rozvíjí v rámci položeného dotazu DBI026 -DB Aplikace - MFF UK 127

128 DBI026 -DB Aplikace - MFF UK
Vytváření pohledů Příkazem CREATE VIEW jmeno_pohledu [jmeno_sloupce [, …]] AS SELECT … [WITH [{CASCADE | LOCAL} CHECK OPTION] DBI026 -DB Aplikace - MFF UK 128

129 DBI026 -DB Aplikace - MFF UK
Vytváření pohledů Příklad: CREATE VIEW Obyvatel_Brna AS SELECT * FROM Obyvatel WHERE Mesto=’Brno’; DBI026 -DB Aplikace - MFF UK 129

130 DBI026 -DB Aplikace - MFF UK
Vytváření pohledů Sloupce mohou být explicitně pojmenované Pokud nejsou, zdědí jména sloupců ze SELECT příkazu WITH CHECK OPTION zajistí, aby vkládané či aktualizované řádky po provedení odpovídaly podmínce v pohledu Pokud by řádka nebyla v pohledu viditelná, aktualizace je odmítnuta DBI026 -DB Aplikace - MFF UK 130

131 DBI026 -DB Aplikace - MFF UK
Vytváření pohledů Příklad: CREATE VIEW Obyvatel_Brna AS SELECT * FROM Obyvatel WHERE Mesto=’Brno’ WITH CHECK OPTION; -- chybná aktualizace UPDATE Obyvatel_Brna SET Mesto=’Ostrava’ WHERE RC=’751015/1234’; DBI026 -DB Aplikace - MFF UK 131

132 DBI026 -DB Aplikace - MFF UK
Vytváření pohledů Použití pohledů Odstínění nutnosti spojení více (normalizovaných) tabulek Individualizace zobrazených dat pro uživatele Různí uživatelé mohou ve stejném pohledu vidět různé řádky Různí uživatelé mohou mít definován stejný pohled různě a zobrazovat jiné sloupce DBI026 -DB Aplikace - MFF UK 132

133 DBI026 -DB Aplikace - MFF UK
Vytváření pohledů Příklad: CREATE VIEW Zam_Moje_Odd AS SELECT Z.Cislo, Z.Prijmeni, Z.Jmeno, Z.Zarazeni FROM Zamestnanec AS Z, Zamestnanec AS X WHERE X.Login=CURRENT_USER AND Z.Oddeleni=X.Oddeleni; DBI026 -DB Aplikace - MFF UK 133

134 DBI026 -DB Aplikace - MFF UK
Vytváření pohledů Některým nevhodně napsaným aplikacím může posun v pořadí ve sloupcích pohledu (nebo i samotné zvýšení počtu sloupců) přinést problémy Při vytváření pohledů je obvykle vhodné zajistit, aby se spolu s přidáváním sloupců do tabulek neposunovaly sloupce stejného významu na jiné pozice v seznamu sloupců Explicitně vyjmenovat sloupce v SELECT příkazu Navíc vhodné všechny sloupce kvalifikovat, buďto jménem tabulky, nebo jejím aliasem Explicitně pojmenovat sloupce pohledu DBI026 -DB Aplikace - MFF UK 134

135 DBI026 -DB Aplikace - MFF UK
Vytváření pohledů Jak zabránit posunu sloupců v pohledech, které používají symbol * pro zobrazení všech řádek? V pohledu nad více pospojovanými tabulkami je vhodné použít * maximálně jednou, pro sloupce konkrétní tabulky (použitím kvalifikátoru jměna tabulky jm_tabulky.*). Za ní už by neměly být žádné sloupce vyjmenované. DBI026 -DB Aplikace - MFF UK 135

136 DBI026 -DB Aplikace - MFF UK
Vytváření pohledů Příklad: CREATE VIEW Zam_Odd AS SELECT Z.RC, Z.Jmeno, O.* FROM Zamestnanec AS Z NATUAL RIGHT OUTER JOIN Oddeleni AS O; DBI026 -DB Aplikace - MFF UK 136

137 DBI026 -DB Aplikace - MFF UK
Vytváření pohledů Není vhodné do pohledu dávat ORDER BY klauzuli Ne vždy je dotaz nad pohledem nutné třídit Někdy je potřeba zcela jiné třídění V řadě případů se více pohledů spojuje v dotazu dohromady a třídění každého z nich může zdržovat DBI026 -DB Aplikace - MFF UK 137

138 DBI026 -DB Aplikace - MFF UK
Vytváření pohledů Při konstrukci dotazů nad více pohledy je vždy vhodné prověřit výsledek plánovačem, ne vždy se optimalizátoru podaří najít vhodný plán provedení Není příliš vhodné používat pohledy obsahující GROUP BY v dalších dotazech. Velmi špatně se optimalizují DBI026 -DB Aplikace - MFF UK 138

139 DBI026 -DB Aplikace - MFF UK
Vytváření pohledů Příklad: CREATE VIEW Pocty_Obyvatel AS SELECT Mesto, COUNT(*) AS Velikost FROM Obyvatel GROUP BY Mesto; SELECT * FROM Pocty_Obyvatel WHERE Mesto=’BRNO’; DBI026 -DB Aplikace - MFF UK 139

140 DBI026 -DB Aplikace - MFF UK
Rušení pohledů Příkazem DROP VIEW jmeno_pohledu; DBI026 -DB Aplikace - MFF UK 140

141 Odlišnosti v implementaci
CREATE VIEW jm [(sloupec [, …])] AS SELECT … [WITH {CHECK OPION | READ ONLY}]; Seznam sloupců v závorkách WITH READ ONLY nedovoluje žádnou aktualizaci CREATE VIEW jm [(sloupec [, …])] [WITH ENCRYPTION] AS SELECT … [WITH CHECK OPION]; DBI026 -DB Aplikace - MFF UK 141

142 DBI026 -DB Aplikace - MFF UK
Datový slovník USER_VIEWS USER_TAB_COLUMNS INFORMATION_SCHEMA.VIEWS DBI026 -DB Aplikace - MFF UK 142

143 Procedurální rozšíření SQL
PL/SQL vs. Transact SQL 143

144 Procedurální rozšíření SQL proč jej používat
n x 1 Ve standardním SQL server obdrží a vyhodnotí vždy jednotlivý příkaz. V daném případě se odešle 2n paketů na server a 2n paketů zpět. for (;;) { FETCH; if (…) break; if (…) INSERT …; else UPDATE …; }; DBI026 -DB Aplikace - MFF UK 144

145 Procedurální rozšíření SQL proč jej používat
1 Pomocí procedurálního rozšíření je možné na server odeslat a zpracovat rozsáhlejší kus kódu včetně řízení toku V daném případě se odešle 1 paket na server a 1 paket zpět. LOOP FETCH; EXIT WHEN (…); IF (…) THEN INSERT …; ELSE UPDATE …; END LOOP; DBI026 -DB Aplikace - MFF UK 145

146 Procedurální rozšíření SQL proč jej používat
Šetření komunikačního kanálu Menší množství odesílaných povelů v jednom povelu je vetší množství příkazů Podstatně menší objem přenesených dat Data se zpracují na serveru bez přenosu na klienta Odlehčení klienta Možnost ukládat a vykonávat kód na serveru Kód na serveru může být používán všemi klientskými aplikacemi DBI026 -DB Aplikace - MFF UK 146

147 Procedurální rozšíření SQL použití
Rozšíření možností serveru o další uživatelské funkce a procedury Zvýšená ochrana integrity dat Triggery Zapouzdření povolených manipulací s daty do procedur a funkcí Aplikace nemusí mít práva pro přímý přístup k tabulkám DBI026 -DB Aplikace - MFF UK 147

148 Procedurální rozšíření SQL problémy
Podstatně menší přenositelnost než v případě definic tabulek a příkazů pro manipulaci s daty (INSERT, UPDATE, DELETE) Standardizováno poprvé v SQL-99 Řada proprietárních řešení v jednotlivých implementacích serverů Navzájem nekompatibilní DBI026 -DB Aplikace - MFF UK 148

149 DBI026 -DB Aplikace - MFF UK
Struktura Bloky kódu s pevnou strukturou Příkazy ukončené středníkem [DECLARE deklarace] BEGIN výkonná část [EXCEPTION ošetření výjimek] END; Posloupnosti příkazů Nemusí být ukončeny středníkem DECLARE sekce je chápána jako příkaz BEGIN … END také DBI026 -DB Aplikace - MFF UK 149

150 DBI026 -DB Aplikace - MFF UK
Struktura DECLARE podil NUMBER; BEGIN SELECT citatel/jmenovatel INTO podil FROM Zlomky WHERE citatel=123; IF podil > 0 THEN UPDATE Zlomky SET Vysledek=Podil WHERE citatel=123; END IF; END; DECLARE @podil FLOAT SELECT @podil = citatel/jmenovatel FROM Zlomky WHERE citatel=123 > 0 UPDATE Zlomky SET Vysledek WHERE citatel=123 DBI026 -DB Aplikace - MFF UK 150

151 DBI026 -DB Aplikace - MFF UK
Deklarace proměnných jméno [CONSTANT] typ [:= výraz]; Základní typy Standardní BOOLEAN obsahující TRUE, FALSE, NULL @jméno [AS] typ DBI026 -DB Aplikace - MFF UK 151

152 Deklarace typu v PL/SQL
Explicitně jménem X NUMERIC(7,2); Kopírováním typu jiné proměnné Y X%Type; Kopírováním typu sloupce E EMP.Ename%Type; Kopírováním typu řádku R EMP%RowType; Record, obsahující pole odpovídající sloupcům Přístup pomocí obvyklé tečkové notace DBI026 -DB Aplikace - MFF UK 152

153 DBI026 -DB Aplikace - MFF UK
Příkazy Prázdný příkaz NULL; Přiřazovací příkaz prom := výraz; SQL příkaz UPDATE Emp SET Sal = Sal*1.05; DELETE FROM Emp WHERE EmpNo=1; Přiřazovací příkaz = výraz SQL příkaz UPDATE Emp SET Sal = Sal*1.05; DELETE FROM Emp WHERE EmpNo=1 DBI026 -DB Aplikace - MFF UK 153

154 DBI026 -DB Aplikace - MFF UK
Příkazy SELECT, vracející právě jednu řádku SELECT výr1 [, …] INTO prom1 [, …] FROM … WHERE …; SELECT, vracející právě jednu řádku SELECT @prom1 = výr1 [, …] FROM … WHERE …; DBI026 -DB Aplikace - MFF UK 154

155 DBI026 -DB Aplikace - MFF UK
PL/SQL procedury CREATE [OR REPLACE] PROCEDURE jmproc [(deklarace_parametru [, …])] {AS | IS} blok_bez_klíčového_slova_DECLARE; Deklarace parametru jméno [IN] [OUT] typ [{:= | DEFAULT} výraz] IN parametr lze uvnitř procedury číst OUT parametr lze uvnitř procedury měnit Volání procedury v SQL*Plus (v PL/SQL standardně) EXEC jmproc[(výraz [, …])] Parametry se předávají podle pořadí EXEC jmproc[(jméno=>výraz [, …]) Parametry se předávají podle jména DBI026 -DB Aplikace - MFF UK 155

156 Velikost typů se u parametrů neuvádí
PL/SQL procedury CREATE PROCEDURE UpdEmpSal ( xEmpNo NUMBER, xSal NUMBER, xComm NUMBER DEFAULT NULL ) AS BEGIN UPDATE Emp SET Sal = xSal, Comm = xComm WHERE EmpNo=xEmpNo; END; / EXEC UpdEmpSal(1234,15500) -- bez odměn; EXEC UpdEmpSal(4321,14000,500); Velikost typů se u parametrů neuvádí DBI026 -DB Aplikace - MFF UK 156

157 DBI026 -DB Aplikace - MFF UK
T-SQL procedury CREATE PROCEDURE jmproc [; číslo] [deklarace_parametru [, …]] [WITH RECOMPILE] AS příkazy [;] Deklarace parametru @jméno typ [= výraz] [OUT[PUT]] OUT[PUT] parametr je výstupní číslo umožňuje vytvoření více verzí stejné procedury Volání procedury EXEC[UTE] jmproc [výraz [, …]] Parametry se předávají podle pořadí EXEC[UTE] jmproc [, …]] Parametry se předávají podle jména DBI026 -DB Aplikace - MFF UK 157

158 DBI026 -DB Aplikace - MFF UK
T-SQL procedury CREATE PROCEDURE UpdEmpSal @xEmpNo INTEGER, @xSal INTEGER, @xComm INTEGER = NULL AS UPDATE Emp SET Sal Comm WHERE EXEC = = 15500; GO EXEC UpdEmpSal 4321, 14000, 500; GO DBI026 -DB Aplikace - MFF UK 158

159 DBI026 -DB Aplikace - MFF UK
PL/SQL funkce CREATE [OR REPLACE] FUNCTION jmfunc [(deklarace_parametru [, …])] RETURN typ {AS | IS} blok_bez_klíčového_slova_DECLARE; Návrat hodnoty RETURN výraz; Ukončí provádění funkce Funkce vždy musí vrátit hodnotu. Pokud ne, generuje se výjimka Volání funkce shodné s jakoukoli standardní funkcí SELECT jmfunc[(výraz [, …])] FROM …; Parametry se předávají podle pořadí SELECT jmfunc[(jméno=>výraz [, …])] FROM …; Parametry se předávají podle jména DBI026 -DB Aplikace - MFF UK 159

160 DBI026 -DB Aplikace - MFF UK
PL/SQL funkce CREATE FUNCTION Polynom2 ( x NUMBER, a NUMBER DEFAULT 0, b NUMBER DEFAULT 0, c NUMBER DEFAULT 0 ) RETURN NUMBER AS BEGIN RETURN (a*x+b)*x+c; END; / SELECT Polynom2(1, b=>2) FROM DUAL; -- 2*x, x=1, tj. 2 SELECT Polynom2(2, b=>3, c=>5) FROM DUAL; -- 3*x+5, x=2, tj. 11 SELECT Polynom2(2, 1, 1, 1) FROM DUAL; -- x2+x+1, x=2, tj. 7 DBI026 -DB Aplikace - MFF UK 160

161 DBI026 -DB Aplikace - MFF UK
T-SQL funkce CREATE FUNCTION jmfunc [(deklarace_parametru [, …])] RETURNS typ [AS] BEGIN … RETURN výraz; END [;] Volání funkce shodné se standardní funkcí Závorky musí být i v případě fce bez parametrů SELECT jmfunc([výraz [, …]]) FROM …; Parametry se předávají podle pořadí SELECT [, …]]) FROM …; Parametry se předávají podle jména DBI026 -DB Aplikace - MFF UK 161

162 DBI026 -DB Aplikace - MFF UK
T-SQL funkce CREATE FUNCTION Polynom2 ( @x FLOAT, @a FLOAT = 0, @b FLOAT = 0, @c FLOAT = 0 ) RETURNS FLOAT AS BEGIN RETURN END; GO SELECT -- 2*x, x=1, tj. 2 -- 3*x+5, x=2, tj. 11 SELECT Polynom2(2, 1, 1, 1); -- x2+x+1, x=2, tj. 7 DBI026 -DB Aplikace - MFF UK 162

163 T-SQL funkce vracející tabulku
CREATE FUNCTION jmfunc [(deklarace_parametru [, …])] RETURNS TABLE [AS] RETURN [(] SELECT …[)] Použití jako pohled (tentokrát i s parametry) SELECT * FROM jmfunc([výraz [, …]]); DBI026 -DB Aplikace - MFF UK 163

164 T-SQL funkce vracející tabulku
CREATE FUNCTION jmfunc [(deklarace_parametru [, …])] TABLE (def. tabulky) [AS] BEGIN tělo, vkládající data do RETURN END [;] Použití jako pohled (tentokrát i s parametry) SELECT * FROM jmfunc([výraz [, …]]); DBI026 -DB Aplikace - MFF UK 164

165 DBI026 -DB Aplikace - MFF UK
Řídící příkazy - IF IF podmínka THEN příkazyIF [ELSIF podmínka THEN příkazyELSIF1 [ELSIF podmínka THEN příkazyELSIF2…]] [ELSE příkazyELSE ] END IF; Podmínka, vyhodnocená jako NULL je považována za nesplněnou IF podmínka příkazIF | blokIF [ELSE příkazELSE | blokELSE] Podmínka, vyhodnocená jako NULL je považována za nesplněnou DBI026 -DB Aplikace - MFF UK 165

166 DBI026 -DB Aplikace - MFF UK
Řídící příkazy - WHILE WHILE podmínka LOOP … [EXIT WHEN podmínka] … END LOOP; While-cyklus s možným výskokem uprostřed WHILE podmínka příkazWHILE | blokWHILE BREAK ukončí cyklus CONTINUE ukončí iteraci DBI026 -DB Aplikace - MFF UK 166

167 DBI026 -DB Aplikace - MFF UK
Řídící příkazy - LOOP LOOP … [EXIT WHEN podmínka] … END LOOP; Obecný cyklus s výskokem uprostřed Výskok je možné realizovat i pomocí IF podmínka THEN exit; END IF; DBI026 -DB Aplikace - MFF UK 167

168 DBI026 -DB Aplikace - MFF UK
Řídící příkazy - FOR FOR I IN LOOP … [EXIT WHEN podmínka] … END LOOP; FOR I IN REVERSE LOOP … END LOOP; DBI026 -DB Aplikace - MFF UK 168

169 DBI026 -DB Aplikace - MFF UK
Řídící příkazy - GOTO GOTO návěští; … <<návěští>> příkaz; Za návěštím musí být příkaz, alespoň prázdný příkaz NULL; GOTO návěští … návěští : … DBI026 -DB Aplikace - MFF UK 169

170 DBI026 -DB Aplikace - MFF UK
Řídící příkazy PL/SQL Pojmenované bloky <<návěští>> DECLARE … BEGIN … END [návěští]; Pojmenované cykly <<návěští>> LOOP … END LOOP [návěští]; Umožňují přistupovat na překryté proměnné kvalifikací jménem bloku Umožňují vyskakovat z více cyklů najednou: EXIT návěští WHEN … DBI026 -DB Aplikace - MFF UK 170

171 SELECT příkazy – PL/SQL
SELECT výrazy INTO proměnné FROM … WHERE …; Musí vracet právě jednu řádku, jinak výjimka NO_DATA_FOUND TOO_MANY_ROWS DECLARE xEmpNo EMP.EmpNo%TYPE; xEName EMP.EName%TYPE; y Emp%ROWTYPE; BEGIN SELECT EmpNo, EName INTO xEmpNo, xEName FROM EMP WHERE EmpNo=1; SELECT * INTO y FROM EMP WHERE EmpNo=2; END; DBI026 -DB Aplikace - MFF UK 171

172 DBI026 -DB Aplikace - MFF UK
SELECT příkazy – T-SQL SELECT výrazy @proměnná=výraz [, …] FROM … WHERE …; Musí vracet právě jednu řádku, jinak výjimka DECLARE @xEmpNo INT, @xEName VARCHAR(30) SELECT @xEmpNo = EmpNo, @xEName = EName FROM EMP WHERE EmpNo=1 DBI026 -DB Aplikace - MFF UK 172

173 Víceřádkový SELECT - PL/SQL
Víceřádkové SELECT příkazy bez INTO lze zpracovat jedině pomocí kurzorů Kurzory mají atributy, dostupné přes konstrukci kurzor%atribut IsOpen BOOLEAN Found BOOLEAN NotFound BOOLEAN RowCount NUMBER DECLARE CURSOR C IS SELECT * FROM EMP; R C%RowType; BEGIN OPEN C; LOOP FETCH C INTO R; EXIT WHEN NOT C%Found; … END LOOP; CLOSE C; END; DBI026 -DB Aplikace - MFF UK 173

174 Víceřádkový SELECT – T-SQL
Víceřádkové SELECT příkazy bez INTO lze zpracovat jedině pomocí kurzorů Po každém FETCH je nutné zkontrolovat 0 … v pořádku -1 … za koncem kurzoru -2 … řádka chybí DECLARE C CURSOR FOR SELECT * FROM EMP; OPEN C; FETCH NEXT FROM C; WHILE BEGIN … FETCH NEXT FROM C; END; CLOSE C; DEALLOCATE C; DBI026 -DB Aplikace - MFF UK 174

175 Víceřádkový SELECT - PL/SQL
Jednodušší zpracování kurzorů nabízejí kurzorové FOR cykly DECLARE CURSOR C IS SELECT * FROM EMP; R C%RowType; BEGIN FOR R IN C LOOP … END LOOP; END; Tato proměnná se nepoužívá Automaticky deklarovaná proměnná, různá od té deklarované v bloku DBI026 -DB Aplikace - MFF UK 175

176 DBI026 -DB Aplikace - MFF UK
SELECT v PL/SQL Další možností je použití SELECT příkazu přímo v hlavičce FOR cyklu bez deklarace kurzoru DECLARE BEGIN FOR R IN ( SELECT * FROM EMP ) LOOP … END LOOP; END; DBI026 -DB Aplikace - MFF UK 176

177 DBI026 -DB Aplikace - MFF UK
Kurzory s parametry Deklarace CURSOR C(J VARCHAR2, D NUMBER) IS SELECT * FROM EMP WHERE Job=J AND DeptNo=D; Použití OPEN C(’Manager’,10); … CLOSE C; FOR R IN C(’Manager’,10) LOOP … END LOOP; DBI026 -DB Aplikace - MFF UK 177

178 DBI026 -DB Aplikace - MFF UK
Kurzory Deklarace C [SCROLL] CURSOR FOR SELECT …; Získání dat FETCH {NEXT | PRIOR | ABSOLUTE n | RELATIVE n | LAST | FIRST} FROM C [, …]] Pokud kurzor není deklarovaný s klíčovým slovem SCROLL, je možné použít jen NEXT DBI026 -DB Aplikace - MFF UK 178

179 DBI026 -DB Aplikace - MFF UK
Výjimky Slouží k ošetření výjimečných stavů při vykonávání SQL příkazů K výjimkám dochází velmi často Je nutné je korektně obsloužit DBI026 -DB Aplikace - MFF UK 179

180 DBI026 -DB Aplikace - MFF UK
Výjimky Typy výjimek Určené k ošetření na serveru či v klientské aplikaci Standardní pojmenované výjimky Generované serverem, mají přidělené jméno Standardní nepojmenované výjimky Generované serverem, nemají přidělené jméno Určené k ošetření na serveru Uživatelské vnitřní výjimky Definované uživatelem, mají jméno, nemají popis Určené k ošetření v klientské aplikaci Uživatelské aplikační výjimky Definované uživatelem, nemají jméno, mají popis DBI026 -DB Aplikace - MFF UK 180

181 Standardní pojmenované výjimky
Základní výjimky NO_DATA_FOUND TOO_MANY_ROWS DUP_VAL_ON_INDEX INVALID_NUMBER ZERO_DIVIDE Zachytávání EXCEPTION WHEN jm1 [OR jm2 …] THEN příkazy; [WHEN jm3 [OR …] THEN příkazy;] [WHEN OTHERS THEN příkazy;] Blok nezachytí výjimky generované v jeho deklarační části DECLARE x NUMBER := 0; y NUMBER := 1/x; /* ZERO_DIVIDE !! */ Ty jsou zachyceny nejdříve o úroveň výše Zachytí jakoukoli dosud neobslouženou výjimku DBI026 -DB Aplikace - MFF UK 181

182 Uživatelské vnitřní výjimky
Deklarace DECLARE X EXCEPTION; … Generování RAISE X; Zachytávání EXCEPTION [WHEN X THEN …;] WHEN OTHERS …; Problém předefinování <<Vnejsi>> DECLARE X EXCEPTION; BEGIN <<Vnitrni>> DECLARE X EXCEPTION; BEGIN RAISE X; END Vnitrni; EXCEPTION WHEN X THEN …; END Vnejsi; X neošetřeno, propaguje se výš Jiné – Vnejsi.X  neošetří Vnitrni.X DBI026 -DB Aplikace - MFF UK 182

183 Standardní nepojmenované výjimky
Vlastní pojmenování DECLARE X EXCEPTION; PRAGMA EXCEPTION_INIT(X,-54) /* ORA ~ Resource locked */ Zachytávání EXCEPTION WHEN X THEN …; EXCEPTION WHEN OTHERS THEN …; Opětovné vyvolání jakékoli obsloužené výjimky, pokud se má obsloužit i ve vyšších úrovních EXCEPTION … WHEN … THEN … RAISE; DBI026 -DB Aplikace - MFF UK 183

184 Uživatelské aplikační výjimky
Generování RAISE_APPLICATION_ERROR( , -- číslo výjimky  <-20100;-20001> ’Popis’, -- text vysvětlující příčinu ); Pokud se přidá třetí parametr FALSE, výjimka se pouze uloží na zásobník výjimek, ale běh se nepřeruší. To umožňuje vrátit více výjimek, kdy spodní je příčinou té horní DBI026 -DB Aplikace - MFF UK 184

185 DBI026 -DB Aplikace - MFF UK
Výjimky - příklad CREATE PROCEDURE InsEmp ( xEmpNo NUMBER, xEName VARCHAR2, xSal NUMBER DEFAULT NULL) AS xS NUMBER; BEGIN xS := xSal; IF xS IS NULL THEN SELECT MIN(Sal) INTO xS FROM EMP; END IF; INSERT INTO Emp(EmpNo,EName,Sal) VALUES(xEmpNo,xEName,xS); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN RAISE_APPLICATION_ERROR( , ’Zaměstnanec ’||xEmpNo||’ již existuje!’ ); END; / EXEC InsEmp(1234,’Novák’); DBI026 -DB Aplikace - MFF UK 185

186 DBI026 -DB Aplikace - MFF UK
Výjimky – T-SQL BEGIN TRY příkaz END TRY BEGIN CATCH příkaz END CATCH Funkce pro identifikaci chyb ERROR_NUMBER() ERROR_SEVERITY() ERROR_STATE() ERROR_PROCEDURE() ERROR_LINE() ERROR_MESSAGE() DBI026 -DB Aplikace - MFF UK 186

187 DBI026 -DB Aplikace - MFF UK
Výjimky – T-SQL BEGIN TRY příkaz END TRY BEGIN CATCH příkaz END CATCH Zachyceny nejsou Varování s ERROR_SEVERITY<=10 Chyby s ERROR_SEVERITY>20 pokud zastavují vykonávání pro session O úroveň výše zachyceny Kompilační chyby DBI026 -DB Aplikace - MFF UK 187

188 DBI026 -DB Aplikace - MFF UK
Výjimky – T-SQL BEGIN TRY SELECT 1/0; -- zero divide … END TRY BEGIN CATCH SELECT ERROR_NUMBER() AS ErrorNumber, ERROR_SEVERITY() AS ErrorSeverity, ERROR_STATE() AS ErrorState, ERROR_PROCEDURE() AS ErrorProcedure, ERROR_LINE() AS ErrorLine, ERROR_MESSAGE() AS ErrorMessage; END CATCH; GO DBI026 -DB Aplikace - MFF UK 188

189 Uživatelské aplikační výjimky
Generování RAISERROR({ msg_id -- číslo výjimky, >= | msg_str -- text výjimky -- text výjimky v proměnné }, severity, state, argument [, …]) Jednotlivé zprávy lze předpřipravit pomocí sp_addmessage a poté se odkazovat jen pomocí msg_id msg_str může obsahovat odkazy na parametry, podobně jako C-funkce printf, hodnoty předány v argumentech Severity je závažnost chyby pouze skup. sysadmin DBI026 -DB Aplikace - MFF UK 189

190 Přednáška č. 4 Zabezpečení dat Triggery, práva 190

191 Triggery - aktivní databáze
Speciální typ uložené procedury Aktivují se automaticky při splnění nějaké podmínky na serveru Aktualizace dat (zde popsané) Události spojené s DB nebo session Přihlášení, vytvoření/zrušení tabulky atd Mění databázi na aktivní databázi Aktivní pravidla typu Událost  Podmínka  Akce DBI026 -DB Aplikace - MFF UK 191

192 Triggery - aktivní databáze
Pravidla Událost  Podmínka  Akce Událost … změna dat (INSERT/UPDATE/DELETE) Podmínka … měněná data odpovídají podmínce, vyjádřené Boolským SQL výrazem Akce … Provede se příslušná akce, obsahující další příkazy INSERT/UPDATE/DELETE ... DBI026 -DB Aplikace - MFF UK 192

193 Triggery - aktivní databáze
Podrobnější pravidla než integritní omezení Implementovány přímo v databázi Aplikují se shodně pro všechny aplikace Aktivní databáze umožňuje lépe zajistit integritu dat a jejich zpracování, než databáze pasivní DBI026 -DB Aplikace - MFF UK 193

194 Pojmenovávání triggerů
Triggery (pravidla) mohou být pojmenovány libovolným identifikátorem Je vhodné jména konstruovat systematicky tak, aby bylo poznat, ke které tabulce se vztahují, na jakou operaci reagují a další pomocné informace DBI026 -DB Aplikace - MFF UK 194

195 DBI026 -DB Aplikace - MFF UK
Typy triggerů Dva typy triggerů (pravidel aktivní DB) Řádkové aktivují se změnou jednotlivých řádek pokud se mění více řádek, aktivují se pro každou z nich zvlášť Příkazové aktivují se spuštěním příkazu daného typu pro jeden příkaz se aktivují jen jednou bez ohledu na počet měněných řádek DBI026 -DB Aplikace - MFF UK 195

196 Použití tabulkových triggerů
Detailní ověření dat v tabulce, nedosažitelné pomocí integritních omezení Typicky BEFORE row-level triggery Ověření oprávnění provést danou operaci Typicky BEFORE statement-level triggery Žurnálování starých hodnot tabulky Typicky AFTER row-level triggery Žurnálování historie operací nad tabulkou Typicky AFTER statement-level triggery Replikace dat DBI026 -DB Aplikace - MFF UK 196

197 Nevhodná použití triggerů
Suplování aplikační logiky Část aplikační logiky je „skrytá“ před aplikací Změny v datech mají nečekané vedlejší efekty Horší ladění aplikace Pro tento účel je vhodnější použít procedury, které aplikace může (nebo musí, protože nemůže měnit data přímo) explicitně zavolat DBI026 -DB Aplikace - MFF UK 197

198 Tabulkové triggery – PL/SQL
CREATE [OR REPLACE] TRIGGER jm_triggeru {BEFORE | AFTER} {INSERT | DELETE | UPDATE [OF sloupec]} ON jm_tabulky [FOR EACH ROW] [REFERENCING OLD AS jm_old NEW AS jm_new] [WHEN (podmínka)] blok kódu PL/SQL; Definují, co se má provést před, resp. po změně dat v DB Row-level triggery se opakují pro každý řádek, ostatní (statement-level) triggery pro příkaz jako celek DBI026 -DB Aplikace - MFF UK 198

199 Tabulkové triggery – PL/SQL
Aktualizace tabulky se provede takto: 1. BEFORE statement-level triggery 2. BEFORE row-level triggery 3. Aktualizace řádky 4. AFTER row-level triggery 5. AFTER statement-level triggery Pokud kterýkoli krok selže, tj. vrátí neošetřenou výjimku, aktualizace je neplatná Může být definováno více triggerů stejného typu, ale není pro ně definováno relativní pořadí DBI026 -DB Aplikace - MFF UK 199

200 Tabulkové triggery –T-SQL
CREATE TRIGGER trigger_name ON { table | view } [ WITH ENCRYPTION ] { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] } [ WITH APPEND ] AS [{IF UPDATE ( column ) [{ AND | OR } UPDATE ( column ) ] … | IF ( COLUMNS_UPDATED ( bitwise_operator updated_bitmask )}] sql_statement [...] DBI026 -DB Aplikace - MFF UK 200

201 Tabulkové triggery – T-SQL
Aktualizace tabulky se provede takto: 1. Kontrola integritních omezení 2. Vytvoření tabulek deleted a updated 2. Aktualizace / INSTEAD OF trigger 3. AFTER triggery Pokud je operace shledána nekorektní, je možné transakci odrolovat pomocí ROLLBACK TRANSACTION V MS SQL 6.5 je pro možnost vytváření více triggerů stejného typu nutné přidat WITH APPEND klauzuli. V MS SQL 7.0+ je tato klauzule již označována za OBSOLETE. Pořadí vykonávání triggerů je možné definovat pomocí procedury sp_settriggerorder DBI026 -DB Aplikace - MFF UK 201

202 DBI026 -DB Aplikace - MFF UK
Triggery Typy aktualizací lze spojovat v rámci jediného triggeru V Oracle pomocí OR CREATE TRIGGER … BEFORE INSERT OR UPDATE ON … V těle triggerů definovány booleovské predikáty INSERTING, UPDATING, DELETING V MS SQL pomocí oddělení čárkou CREATE TRIGGER … ON … FOR INSERT, UPDATE DBI026 -DB Aplikace - MFF UK 202

203 DBI026 -DB Aplikace - MFF UK
Tabulkové triggery INSTEAD OF triggery slouží pro definici vlastního postupu aktualizace dat Spouští se místo standardních operací INSERT, UPDATE, DELETE V Oracle jsou povolené pouze nad pohledy, ostatní pouze nad tabulkami MS SQL tabulky a pohledy v tomto směru nerozlišuje DBI026 -DB Aplikace - MFF UK 203

204 DBI026 -DB Aplikace - MFF UK
Tabulkové triggery Scénář I: Ověření práva na provedení operace Spouští se obvykle před provedením příkazu, a nekontrolují měněná data Mohou zjistit, zda je uživatel přihlášen ze správného terminálu, zda provádí operaci ve vyhrazeném čase (pracovní době), a řadu dalších kontrol, nedostupných pomocí integritních omezení DBI026 -DB Aplikace - MFF UK 204

205 Tabulkové triggery – PL/SQL
Např.: CREATE OR REPLACE TRIGGER bef_ins_Emp BEFORE INSERT ON Emp BEGIN IF USERENV(’TERMINAL’) NOT LIKE ’PERS%’ THEN RAISE_APPLICATION_ERROR( , ’Zaměstnance lze přijímat pouze na personálním oddělení’ ); END IF; END; / DBI026 -DB Aplikace - MFF UK 205

206 DBI026 -DB Aplikace - MFF UK
Tabulkové triggery Scénář II: Doplnění funkčně závislých hodnot do jednotlivých řádek Provádí se před provedením operace na každé řádce DBI026 -DB Aplikace - MFF UK 206

207 Tabulkové triggery – PL/SQL
V rámci row-level triggerů jsou definovány dva záznamy NEW a OLD obsahující data před změnou a po ní INSERT triggery jen NEW DELETE triggery jen OLD UPDATE triggery obojí Jména lze změnit pomocí klauzule REFERENCING DBI026 -DB Aplikace - MFF UK 207

208 Tabulkové triggery – PL/SQL
Např.: CREATE OR REPLACE TRIGGER bef_ins_Emp_row BEFORE INSERT ON Emp FOR EACH ROW BEGIN -- přidáni umělého klíče IF :NEW.EmpNo IS NULL THEN -- doplnění čísla zaměstnance ze sekvence SELECT SeqEmpNo.nextval INTO :NEW.EmpNo -- před NEW a OLD se píše dvojtečka FROM DUAL; END IF; END; / DBI026 -DB Aplikace - MFF UK 208

209 Tabulkové triggery – PL/SQL
Spuštění triggeru může být podmíněno splněním podmínky uvedené v klauzuli WHEN CREATE OR REPLACE TRIGGER bef_ins_Emp_row BEFORE INSERT ON Emp FOR EACH ROW WHEN (NEW.EmpNo IS NULL) -- ve WHEN klauzuli se před NEW a OLD dvojtečka nepíše BEGIN SELECT SeqEmpNo.nextval INTO :NEW.EmpNo FROM DUAL; END; / DBI026 -DB Aplikace - MFF UK 209

210 Tabulkové triggery – T-SQL
V rámci triggerů jsou definovány dvě pseudo-tabulky inserted a deleted, obsahující nové a staré verze záznamů DBI026 -DB Aplikace - MFF UK 210

211 DBI026 -DB Aplikace - MFF UK
Tabulkové triggery Scénář III: Kontrola vkládaných dat. Provádí se před provedením operace na každé řádce DBI026 -DB Aplikace - MFF UK 211

212 DBI026 -DB Aplikace - MFF UK
Triggery PL/SQL Např.: CREATE OR REPLACE TRIGGER bef_ins_upd_Emp_row BEFORE UPDATE ON Emp FOR EACH ROW BEGIN IF :NEW.Sal > :OLD.Sal * 1.1 THEN RAISE_APPLICATION_ERROR( ,’Plat může být zvýšen maximálně o 10%.’ ); END IF; END; DBI026 -DB Aplikace - MFF UK 212

213 DBI026 -DB Aplikace - MFF UK
Tabulkové triggery Scénář IV: Kontrola vkládaných dat, doplnění závislých hodnot v MS SQL. Nutno provést až po aktualizační operaci s využitím tabulek deleted a inserted. DBI026 -DB Aplikace - MFF UK 213

214 DBI026 -DB Aplikace - MFF UK
Triggery T-SQL Např. CREATE TRIGGER employee_insupd ON emp FOR INSERT, UPDATE AS DECLARE @emp_lvl smallint SELECT @emp_lvl = = i.job_id FROM emp AS e INNER JOIN inserted i ON e.emp_id = i.emp_id JOIN jobs j ON j.job_id = i.job_id IF = 1) and <> 10) BEGIN RAISERROR ('Job id 1 expects the default level of 10.', 16, 1) ROLLBACK TRANSACTION END DBI026 -DB Aplikace - MFF UK 214

215 DBI026 -DB Aplikace - MFF UK
Triggery T-SQL Např. CREATE TRIGGER employee_insupd ON emp FOR INSERT, UPDATE AS BEGIN UPDATE e SET empname = upper(empname) FROM emp AS e JOIN inserted i ON e.emp_id = i.emp_id WHERE UPDATED(empname) END DBI026 -DB Aplikace - MFF UK 215

216 DBI026 -DB Aplikace - MFF UK
Tabulkové triggery Scénář V: Žurnálování změn v tabulce. Vhodné provést až po úspěšné aktualizační operaci. Je možné zapamatovat si původní i novou hodnotu, čas aktualizace, jejího autora a podobně DBI026 -DB Aplikace - MFF UK 216

217 DBI026 -DB Aplikace - MFF UK
Triggery PL/SQL Např.: CREATE OR REPLACE TRIGGER aft_upd_Emp_row AFTER UPDATE ON Emp FOR EACH ROW WHEN (OLD.Sal <> NEW.Sal) BEGIN INSERT INTO Zurnal(Kdo, Kdy, Puvodni, Novy) VALUES(USER, SYSDATE, :OLD.Sal, :NEW.Sal); END; DBI026 -DB Aplikace - MFF UK 217

218 DBI026 -DB Aplikace - MFF UK
Triggery T-SQL Např.: CREATE TRIGGER aft_upd_Emp ON employee FOR UPDATE AS BEGIN INSERT INTO Zurnal(Kdo, Kdy, Puvodni, Novy) SELECT CURRENT_USER, CURRENT_DATE, d.Sal, e.Sal FROM deleted AS d JOIN employee AS e ON d.emp.id=e.emp_id WHERE UPDATED(Sal); END; DBI026 -DB Aplikace - MFF UK 218

219 Triggery na pohledech – PL/SQL
CREATE [OR REPLACE] TRIGGER jm_triggeru INSTEAD OF {INSERT | DELETE | UPDATE [OF sloupec]} ON jm_pohledu FOR EACH ROW [REFERENCING OLD AS jm_old NEW AS jm_new] [WHEN (podmínka)] blok kódu PL/SQL; Definují, jak se má provést změna dat v DB DBI026 -DB Aplikace - MFF UK 219

220 DBI026 -DB Aplikace - MFF UK
Datový slovník Pohledy USER_TRIGGERS USER_SOURCE Pohledy SYS.TRIGGERS SYS.TRIGGER_EVENTS DBI026 -DB Aplikace - MFF UK 220

221 DBI026 -DB Aplikace - MFF UK
Práva k objektům v SQL Standardně má každý uživatel přístup jen k datům ve svém schématu Přístup k dalším objektům je nutné explicitně povolit pomocí příkazu GRANT, případně opětovně zakázat pomocí příkazu REVOKE DBI026 -DB Aplikace - MFF UK 221

222 DBI026 -DB Aplikace - MFF UK
Práva k objektům v SQL Standardně má každý uživatel přístup jen k datům ve svém schématu Přístup k dalším objektům je nutné explicitně povolit pomocí příkazu GRANT, případně opětovně zakázat pomocí příkazu REVOKE DBI026 -DB Aplikace - MFF UK 222

223 Práva k objektům v SQL GRANT
GRANT {ALL [PRIVILEGES] | právo [, …]} ON objekt TO {PUBLIC | uživatel | skupina } [, …] [WITH GRANT OPTION] DBI026 -DB Aplikace - MFF UK 223

224 Práva k objektům v SQL GRANT
SELECT INSERT UPDATE ALTER EXECUTE WITH GRANT OPTION Nabyvatel práv může tyto práva dále propůjčovat Pokud tento uživatel o právo v budoucnosti přijde, odebere se i těm, kterým ho propůjčil DBI026 -DB Aplikace - MFF UK 224

225 DBI026 -DB Aplikace - MFF UK
Práva a role GRANT SELECT, INSERT ON Zamestnanec TO SCOTT; GRANT ALL EXCEPT DROP ON Oddeleni TO SCOTT WITH GRANT OPTION; GRANT SELECT ON Zamestnanec TO PUBLIC; SCOTT může číst a doplňovat data v mé tabulce Zamestnanec SCOTT nemůže tabulku zrušit, ale může propůjčovat svá práva dalším Kdokoli může číst data DBI026 -DB Aplikace - MFF UK 225

226 DBI026 -DB Aplikace - MFF UK
Práva a role CREATE ROLE Student; GRANT Student TO Novak; GRANT SELECT ON Emp TO Student; CREATE ROLE Seminar [IDENTIFIED BY heslo]; GRANT UPDATE, INSERT ON Emp TO Seminar; GRANT Student TO Seminar; Vytvoř roli Zařaď Nováka mezi studenty Všichni studenti mohou číst data z tabulky Emp Další (zaheslovaná) role Účastníci semináře mohou data měnit a vytvářet Účastníci semináře jsou zároveň studenty DBI026 -DB Aplikace - MFF UK 226

227 DBI026 -DB Aplikace - MFF UK
Práva k objektům v SQL V databázi může díky WITH GRANT OPTION existovat více než jedna cesta, která propůjčuje uživateli nějaké právo na daný objekt. Uživatel je oprávněn danou operaci provádět, dokud existuje alespoň jedna taková cesta DBI026 -DB Aplikace - MFF UK 227

228 DBI026 -DB Aplikace - MFF UK
Práva a role SCOTT.Emp SCOTT ALL Seminar Student SELECT UPDATE INSERT ALL WITH G.O. NOVAK UPDATE DELETE WITH G.O. KOPECKY DBI026 -DB Aplikace - MFF UK 228

229 DBI026 -DB Aplikace - MFF UK
Využití práv přístupu Díky právům je možné zcela oddělit uživatele, který data vlastní (a může s nimi provádět cokoli včetně zrušení tabulek) od uživatel, kteří s daty pracují v klientských aplikacích Uživatelé se mohou hlásit pod jiná schémata a pracovat s daty, které jim nepatří. Mohou tak provádět pouze operace, které jim vlastník explicitně povolil Nemohou například deaktivovat triggery a integritní omezení DBI026 -DB Aplikace - MFF UK 229

230 Práva k objektům v SQL REVOKE
REVOKE {ALL [PRIVILEGES] | právo [, …]} ON objekt FROM {PUBLIC | uživatel | skupina } [, …] DBI026 -DB Aplikace - MFF UK 230

231 Přístup k cizím objektům
Prostřednictvím tečkové notace název_schematu.název_objektu DBI026 -DB Aplikace - MFF UK 231

232 Přístup k datům pomocí procedur, funkcí a triggerů
Procedury, funkce a triggery se standardně vykonávají pod uživatelem, který je definoval (obdoba propůjčení identity v OS UNIX/Linux) To je vhodné pro odstínění uživatele od tabulek, se kterými se manipuluje Uživatel, který je spouští, nemusí mít práva pro manipulaci s tabulkami DBI026 -DB Aplikace - MFF UK 232

233 Přístup k datům pomocí procedur, funkcí a triggerů
V některých případech je potřebné, aby se procedura vykonávala s právy uživatele, který ji spouští V Oracle pomocí klauzule AUTHID {CURRENT_USER|DEFINER} CURRENT_USER ~ s právy uživatele, volajícího fci, proceduru, … DEFINER ~ s právy toho, kdo proceduru vlastní V MS SQL pomocí klauzule EXECUTE AS {CALLER|SELF|OWNER|’username’} CALLER ~ s právy uživatele, volajícího fci, proceduru, … SELF ~ s právy toho, kdo proceduru vytvořil OWNER ~ s právy toho, kdo proceduru vlastní ’username’ ~ s právy daného uživatele DBI026 -DB Aplikace - MFF UK 233

234 Přístup k datům pomocí procedur, funkcí a triggerů
Např. CREATE OR REPLACE PROCEDURE p AUTHID CURRENT_USER AS …; CREATE OR REPLACE FUNCTION f RETURN NUMERIC AUTHID CURRENT_USER AS …; DBI026 -DB Aplikace - MFF UK 234

235 Přístup k datům pomocí procedur, funkcí a triggerů
Např. CREATE PROCEDURE p AS … EXECUTE AS … CREATE FUNCTION f RETURNS NUMERIC AS … EXECUTE AS … DBI026 -DB Aplikace - MFF UK 235

236 Provedení operace v nezávislé transakci
Některé operace je vhodné provést nezávisle na to, zda se podaří či nepodaří aktualizace, se kterou je operace svázána Např. vhodné pro žurnálování pokusů o provedení nedovolené operace, které se odporují integritním omezením, a proto se neuloží. V Oracle pomocí PRAGMA AUTONOMOUS_TRANSACTION v deklaraci bloku DBI026 -DB Aplikace - MFF UK 236

237 Provedení operace v nezávislé transakci
Např. CREATE OR REPLACE PROCEDURE p AUTHID CURRENT_USER AS PRAGMA AUTONOMOUS_TRANSACTION; …; DBI026 -DB Aplikace - MFF UK 237

238 Víceuživatelský režim
Je nutné mít na paměti, že databázová aplikace nad daty neběží obvykle sama Většinou běží nad daty několik (desítek, stovek) instancí téže aplikace, případně různé aplikace, pracující se stejnými daty Je nutné, aby aplikace běžela korektně i v paralelním režimu! DBI026 -DB Aplikace - MFF UK 238

239 Víceuživatelský režim
Kontroly by měly být prováděny „co nejblíže“ k uloženým datům Co lze provést pomocí definic integritních omezení, definovat s jejich pomocí Co lze následně provést pomocí triggerů, provést pomocí triggerů Kontroly, aktualizace závislých hodnot v databázi, … Procedury a funkce pro manipulaci s daty DBI026 -DB Aplikace - MFF UK 239

240 Víceuživatelský režim
Hlídání unikátnosti sloupce jinak než pomocí UNIQUE / PRIMARY KEY nebude pravděpodobně fungovat Posloupnost SELECT COUNT(*) FROM … IF /* řádka neexistuje */ INSERT INTO … nemusí jít spustit paralelně, obě transakce mohou nejprve zjistit počet a potom obě zapsat stejnou řádku DBI026 -DB Aplikace - MFF UK 240

241 Víceuživatelský režim
Stupně izolace transakcí dle ANSI SQL READ UNCOMMITED Může nastat: Dirty read, Nonrepeatable Read, Phantom Read READ COMMITED Může nastat: Nonrepeatable Read, Phantom Read REPEATABLE READ Může nastat: Phantom Read SERIALIZABLE DBI026 -DB Aplikace - MFF UK 241

242 Víceuživatelský režim
Dirty read - READ UNCOMMITED (transakce vidí data, změněná, ale nepotvrzená, jinou transakcí) Transakce 1 Transakce 2 UPDATE Ucet /* > 10100*/ SET Zustatek = Zustatek*1.01 WHERE Cis_Uctu = ´ ´; SELECT Zustatek /*10100*/ FROM Ucet WHERE Cis_Uctu = ´ ´; ROLLBACK; DBI026 -DB Aplikace - MFF UK 242

243 Víceuživatelský režim
Non-repeatable read - READ UNCOMMITED, READ COMMITED (transakce čte stejná data vícekrát, pokaždé s jinou hodnototu) Transakce 1 Transakce SELECT Zustatek /*10000*/ FROM Ucet WHERE Cis_Uctu = ´ ´; UPDATE Ucet /* > 10100*/ SET Zustatek = Zustatek*1.01 WHERE Cis_Uctu = ´ ´; COMMIT; SELECT Zustatek /*10100*/ FROM Ucet WHERE Cis_Uctu = ´ ´; DBI026 -DB Aplikace - MFF UK 243

244 Víceuživatelský režim
Phantom read - READ UNCOMMITED, READ COMMITED, REPEATABLE READ (transakce provádí SELECT vícekrát, pokaždé s jinou výslednou množinou) Transakce 1 Transakce SELECT * /*Bez ´ ´*/ FROM Ucet WHERE Typ_Uctu = ´Běžný´; INSERT INTO Ucet VALUES(´ ´, ´Běžný´); COMMIT; SELECT * /*Včetně ´ ´*/ FROM Ucet WHERE Typ_Uctu = ´Běžný´; DBI026 -DB Aplikace - MFF UK 244

245 Víceuživatelský režim
READ UNCOMMITED READ COMMITED REPEATABLE READ SERIALIZABLE Dirty read Non-repeatable read Phantom read   READ UNCOMMITED READ COMMITED REPEATABLE READ SERIALIZABLE Read lock Write lock Range lock DBI026 -DB Aplikace - MFF UK 245

246 Víceuživatelský režim
Oracle standardně garantuje pouze konzistenci na úrovni příkazů, ekvivalentní nastavení SET TRANSACTION ISOLATION LEVEL READ COMMITED Lze nastavit přísnější kontrolu SET TRANSACTION ISOLATION LEVEL SERIALIZABLE která se ale hodí pouze pro krátké transakce DBI026 -DB Aplikace - MFF UK 246

247 Víceuživatelský režim
MS SQL podporuje všechny úrovně izolace Ve verzi 6.5 je REPEATABLE READ shodná s přísnější variantou SERIALIZABLE Od verze 7.0 jsou díky existenci řádkových zámků obě úrovně rozlišené DBI026 -DB Aplikace - MFF UK 247

248 Přednáška č. 5 Transakce 248

249 Transakční zpracování
Dovoluje uzavírat více logicky souvisejících příkazů do jediné atomické operace SŘBD zajistí, aby se provedly a permanentně uložily výsledky všech příkazů, nebo žádný z nich Příkazy dle SQL-92 COMMIT [WORK] … potvrzení transakce ROLLBACK [WORK] … odvolání transakce DBI026 -DB Aplikace - MFF UK 249

250 Transakční zpracování
Na konci každé transakce musí být databáze v konzistentním stavu Integritní omezení se standardně kontrolují po každé operaci Integritní omezení má dva příznaky: DEFERRABLE a DEFERRED [CONSTRAINT jméno] definice_omezení [INITIALLY {DEFERRED|IMMEDIATE}] [[NOT] DEFERRABLE] Pokud jsou oba příznaky zapnuté, kontrola se provádí při COMMITu. Pokud nejsou splněny, provede se ROLLBACK DBI026 -DB Aplikace - MFF UK 250

251 Víceuživatelský režim
Oracle automaticky zahajuje transakce, jakmile je předchozí transakce ukončena. Transakce nemohou být hnízděné (Procedury, funkce a triggery mohou běžet v samostatných nezávislých transakcích) DBI026 -DB Aplikace - MFF UK 251

252 Víceuživatelský režim
MS SQL dovoluje rovněž syntaxi COMMIT TRANSACTION [name|:var] ROLLBACK TRANSACTION [name|:var] pro ukončení transakce, začaté příkazem BEGIN TRANSACTION [name|:var] Transakce mohou být hnízděné DBI026 -DB Aplikace - MFF UK 252

253 Transakční zpracování
Bod zotavení (SAVEPOINT) V rámci transakce je možné vytvářet pojmenované kontrolní body, které slouží k částečnému odvolávání transakcí Vhodné např. pokud je potřeba nějakou část transakce při neúspěchu zopakovat, s možností zachování předcházejících operací v transakci beze změny S1 DBI026 -DB Aplikace - MFF UK 253

254 Víceuživatelský režim
Oracle používá standardní syntaxi SAVEPOINT name; ROLLBACK [WORK] TO SAVEPOINT name; DBI026 -DB Aplikace - MFF UK 254

255 Víceuživatelský režim
MS SQL používá syntaxi SAVE TRANSACTION name|:var ROLLBACK TRANSACTION name|:var DBI026 -DB Aplikace - MFF UK 255

256 Přednáška č. 6 Explicitní zamykání 256

257 DBI026 -DB Aplikace - MFF UK
Explicitní zamykání Za běžných okolností provádí zamykání řádek v tabulkách databázový server sám na základě nastavení úrovně izolace příkazem SET TRANSACTION ISOLATION LEVEL V některých případech je potřebné či žádoucí zamknout některé řádky či celé tabulky explicitně DBI026 -DB Aplikace - MFF UK 257

258 DBI026 -DB Aplikace - MFF UK
Explicitní zamykání Kdy zamykat tabulky před provedením hromadných aktualizací dat v tabulce či tabulkách migrace na jinou strukturu dat hromadné zpracování dat na přelomu roku inventury ... lze použít rovněž jako synchronizační prvek (semafor) pro vzájemné vyloučení více klientů v kritické sekci aplikace DBI026 -DB Aplikace - MFF UK 258

259 DBI026 -DB Aplikace - MFF UK
Explicitní zamykání Kdy zamykat řádky Například řádka v nadřízené tabulce při manipulaci s podřízenými řádkami Zabránění současné manipulace s daty více transakcemi DBI026 -DB Aplikace - MFF UK 259

260 Explicitní zamykání v Oracle
Uzamknutí řádek získaných SELECT příkazem v exkluzivním režimu SELECT …FOR UPDATE [NOWAIT]; Pokud je uvedeno NOWAIT, Oracle vrací výjimku ORA DECLARE UZAMKNUTO EXCEPTION; PRAGMA EXCEPTION_INIT(UZAMKNUTO,-54); BEGIN … EXCEPTION WHEN UZAMKNUTO THEN …; END; DBI026 -DB Aplikace - MFF UK 260

261 Explicitní zamykání v Oracle
Uzamknutí řádek získaných SELECT příkazem v exkluzivním režimu SELECT …FOR UPDATE [NOWAIT]; Pokud není uvedeno NOWAIT, transakce je zablokována do uvolnění zámku ostatními transakcemi. Může dojít k deadlocku. V takovém případě je v některé z transakcí generována výjimka ORA-00060 DBI026 -DB Aplikace - MFF UK 261

262 Explicitní zamykání v MS SQL
Uzamknutí stránek/řádek získaných SELECT příkazem: BEGIN TRAN[SACTION] SELECT …WITH (požadavky_na_zamykání); NOLOCK … nevytvářet sdílený z., ignorovat exist. z. HOLDLOCK … ponechat sdílený z. do konce transakce UPDLOCK … vytvořit aktualizační zámek do konce transakce READ[UN]COMMITTED, REPEATABLEREAD, SERIALIZABLE … stejná sémantika jako při odpovídajícím nastavení transakce DBI026 -DB Aplikace - MFF UK 262

263 Explicitní zamykání v MS SQL
Uzamknutí stránek/řádek získaných SELECT příkazem: BEGIN TRAN[SACTION] SELECT …WITH (požadavky_na_zamykání); READPAST … vynechá zamčené řádky ROWLOCK … jemnější řádkové z. místo (defaultních) stránkových zámků PAGLOCK … defaultní stránkové zamykání DBI026 -DB Aplikace - MFF UK 263

264 Explicitní zamykání v Oracle
Uzamknutí tabulky možné jak v exkluzivním, tak sdíleném režimu. Ve sdíleném režimu může tabulku souběžně uzamknout více transakcí. Číst data z tabulky mohou číst i ostatní transakce. LOCK TABLE t IN {SHARED | EXCLUSIVE} MODE [NOWAIT]; DBI026 -DB Aplikace - MFF UK 264

265 Explicitní zamykání v MS SQL
Uzamknutí stránek/řádek získaných SELECT příkazem: BEGIN TRAN[SACTION] SELECT …WITH (požadavky_na_zamykání); TABLOCK … sdílený zámek na celé tabulce do konce příkazu, spolu s HOLDLOCK do konce transakce TABLOCKX … exkluzivní zámek na celé tabulce do konce příkazu, spolu s HOLDLOCK do konce transakce DBI026 -DB Aplikace - MFF UK 265

266 DBI026 -DB Aplikace - MFF UK
Odemknutí zámků Odemyká se pouze implicitně současně s ukončením transakce COMMIT; Změny se potvrdí a zámky uvolní ROLLBACK; Změny se odvolají a zámky uvolní ROLLBACK TO SAVEPOINT jméno; resp. ROLLBACK TRANSACTION jméno|:proměnná Odvolá změny v Oracle, resp. MS SQL od uvedené značky a uvolní odpovídající zámky DBI026 -DB Aplikace - MFF UK 266

267 DBI026 -DB Aplikace - MFF UK
Použití zámků v Oracle DECLARE CURSOR C(d NUMBER) IS SELECT * FROM Emp WHERE DeptNo=d FOR UPDATE NOWAIT; UZAMKNUTO EXCEPTION; PRAGMA EXCEPTION_INIT(UZAMKNUTO,-54); BEGIN FOR I IN LOOP BEGIN FOR R IN C(10) LOOP … END LOOP; EXIT; -- Úspěšný pokus EXCEPTION WHEN UZAMKNUTO THEN NULL; END; END LOOP; END; DBI026 -DB Aplikace - MFF UK 267

268 DBI026 -DB Aplikace - MFF UK
Použití zámků v MS SQL BEGIN TRANS = COUNT(*) FROM tbl WITH ( TABLOCK, UPDLOCK, HOLDLOCK ) DBI026 -DB Aplikace - MFF UK 268

269 Množinové operace, UNION [ALL], INTERSECT, EXCEPT
269

270 DBI026 -DB Aplikace - MFF UK
Množinové operace SQL Pro množinové operace jsou v ANSI SQL definovány tři operátory UNION [ALL] SELECT … FROM … WHERE … UNION ALL SELECT … FROM … WHERE … UNION ALL … Pokud není uvedeno ALL, obsahuje výsledek unikátní řádky, jinak se jen výsledky spojí za sebe Unikátní UNION vyžaduje třídění a slévání výsledků, pokud je to možné, je žádoucí se mu vyhnout INTERSECT Průnik výsledků dvou a více SELECT příkazů EXCEPT (Oracle používá vlastní operátor MINUS) DBI026 -DB Aplikace - MFF UK 270

271 Příkaz WITH, Rekurzivní dotazy
271

272 Rekurzivní dotazy a SQL
Standardní SQL obsahuje podporu pro rekurzi od verze ANSI SQL-99 v příkazu WITH Oracle podporuje od verze 9i release 2 omezenou sémantiku bez podpory rekurze MS SQL podporuje od verze MS SQL Server 2005 Oracle SQL pro rekurzi obsahuje proprietární řešení (s omezenějšími možnostmi) s pomocí speciálních klauzulí START WITH a CONNECT BY příkazu SELECT DBI026 -DB Aplikace - MFF UK 272

273 DBI026 -DB Aplikace - MFF UK
Příkaz WITH WITH t1[(c11[,…])] AS (SELECT …) [,t2[(c21[,…])] AS (SELECT …) SELECT … FROM t1, t2, … Konstrukt WITH definuje zdroje t1, t2, … ze kterých se data vybírají Definice zdroje se může (a nemusí) odkazovat na svojí vlastní definici, či definice předchozích zdrojů v příkazu WITH SELECT se může a nemusí odkazovat na zdroje DBI026 -DB Aplikace - MFF UK 273

274 DBI026 -DB Aplikace - MFF UK
Příkaz WITH Příklad: Nejvyšší počet zaměstnanců v jednom oddělení WITH x AS ( SELECT OddID, COUNT(*) AS Poc FROM Zamestnanec GROUP BY OddID) SELECT MAX(Poc) FROM x; DBI026 -DB Aplikace - MFF UK 274

275 DBI026 -DB Aplikace - MFF UK
Příkaz WITH S použitím WITH WITH x AS ( SELECT OddID, COUNT(*) AS Poc FROM Zamestnanec GROUP BY OddID ) SELECT MAX(Poc) FROM x; Bez použití WITH SELECT MAX(Poc) FROM ( SELECT OddID, COUNT(*) AS Poc FROM Zamestnanec GROUP BY OddID ) x DBI026 -DB Aplikace - MFF UK 275

276 Rekurzivní dotazy a SQL
Příklad: Tabulka Zamestnanec s následující strukturou: ZamID … ID zaměstnance Jmeno … Jméno zaměstnance VedID … ID přímého nadřízeného Je potřeba vypsat zaměstnance spolu s informací, na jaké úrovni řízení jsou zaměstnáni. Zaměstnanci bez vedoucích jsou na první úrovni DBI026 -DB Aplikace - MFF UK 276

277 Rekurzivní dotazy a SQL
Příklad: WITH z AS ( SELECT Jmeno, 0 AS Uroven FROM Zamestnanec x WHERE VedID IS NULL UNION ALL SELECT Jmeno, Uroven+1 AS Uroven FROM Zamestnanec y JOIN z ON y.VedID=z.ZamID ) SELECT * FROM z; DBI026 -DB Aplikace - MFF UK 277

278 DBI026 -DB Aplikace - MFF UK
Stromy v Oracle SQL SELECT sloupce FROM tabulka [WHERE podmínka3] START WITH podmínka1 CONNECT BY podmínka2 [ORDER BY …] Řádky vyhovující podmínce ve START WITH jsou považovány za kořenové řádky na první úrovni vnoření DBI026 -DB Aplikace - MFF UK 278

279 DBI026 -DB Aplikace - MFF UK
Stromy v Oracle SQL SELECT sloupce FROM tabulka [WHERE podmínka3] START WITH podmínka1 CONNECT BY podmínka2 [ORDER BY …] Pro každou řádku na úrovni i se rekurzivně hledají přímí potomci vyhovující podmínce v klauzuli CONNECT BY na úrovni i+1 Řádka předka se v podmínce označuje klíčovým slovem PRIOR DBI026 -DB Aplikace - MFF UK 279

280 DBI026 -DB Aplikace - MFF UK
Stromy v Oracle SQL SELECT sloupce FROM tabulka [WHERE podmínka3] START WITH podmínka1 CONNECT BY podmínka2 [ORDER BY …] Na závěr jsou odstraněny řádky nevyhovující podmínce ve WHERE DBI026 -DB Aplikace - MFF UK 280

281 DBI026 -DB Aplikace - MFF UK
Stromy v Oracle SQL SELECT sloupce FROM tabulka [WHERE podmínka3] START WITH podmínka1 CONNECT BY podmínka2 [NOCYCLE] [ORDER BY …] Pokud není definováno třídění, odpovídá pořadí průchodu pre-order Každý řádek obsahuje pseudo-sloupec LEVEL, obsahující úroveň řádku v hierarchii DBI026 -DB Aplikace - MFF UK 281

282 Rekurzivní dotazy a SQL
Příklad: SELECT Jmeno, Level AS Uroven FROM Zamestnanec z START WITH VedID IS NULL CONNECT BY PRIOR ZamID = VedID; SELECT -- s odsazením dle úrovně LPAD(‘ ‘,2*Level)||Jmeno AS Jmeno, … DBI026 -DB Aplikace - MFF UK 282

283 CASE výrazy 283

284 DBI026 -DB Aplikace - MFF UK
Podmíněné výrazy V řadě případů je potřeba hodnotu výrazu podřídit nějakému větvícímu se rozhodování význam dle číselníku 1 ~ pondělí … 7 ~ neděle 0 ~ 0%, 1 ~ 5%, 2 ~ 22% Vytvářet funkci pro každý takový případ, nebo používat poddotaz do číselníku může být časově náročné (množina hodnot je omezená a nemění se v čase) DBI026 -DB Aplikace - MFF UK 284

285 DBI026 -DB Aplikace - MFF UK
Podmíněné výrazy SQL-92 definuje dvě podoby CASE výrazu a) jednoduchý (simple) CASE výraz: CASE výraz WHEN vzor1 THEN obraz1 WHEN vzor2 THEN obraz2 … [ELSE default] END Vrací obraz pro první shodu výraz=vzori, resp. default hodnotu, resp. NULL DBI026 -DB Aplikace - MFF UK 285

286 DBI026 -DB Aplikace - MFF UK
Podmíněné výrazy SQL-92 definuje dvě podoby CASE výrazu b) vyhledávací (searched) CASE výraz: CASE WHEN podm1 THEN obraz1 WHEN podm2 THEN obraz2 … [ELSE default] END Vrací obraz pro první podmi = TRUE, resp. default hodnotu, resp. NULL DBI026 -DB Aplikace - MFF UK 286

287 DBI026 -DB Aplikace - MFF UK
Podmíněné výrazy Příklad: SELECT Predmet, CASE Den WHEN 1 THEN ’Pondělí’ WHEN 2 THEN ’Úterý’ … WHEN 7 THEN ’Neděle’ ELSE ’Neznámý den v týdnu’ END AS Den_v_tydnu FROM Rozvrh; DBI026 -DB Aplikace - MFF UK 287

288 DBI026 -DB Aplikace - MFF UK
Podmíněné výrazy Příklad prodeje rozdělené dle sazby DPH: SELECT CASE WHEN Sazba=0 THEN Cena ELSE NULL END AS Cena0, CASE WHEN Sazba=1 THEN Cena* ELSE NULL END AS Cena5, CASE WHEN Sazba=2 THEN Cena* ELSE NULL END AS Cena22 FROM Prodej; DBI026 -DB Aplikace - MFF UK 288

289 Podmíněné výrazy v Oracle
Oracle obsahuje navíc propretární řešení s využitím funkce DECODE DECODE(výraz vzor1, obraz1, vzor2, obraz2 [, default]) Obdoba jednoduchého CASE DBI026 -DB Aplikace - MFF UK 289

290 DBI026 -DB Aplikace - MFF UK
Podmíněné výrazy Příklad: SELECT Predmet, DECODE(Den 1, ’Pondělí’, 2, ’Úterý’, … 7, ’Neděle’ ’Neznámý den v týdnu’ ) AS Den_v_tydnu FROM Rozvrh; DBI026 -DB Aplikace - MFF UK 290

291 ROLLUP a CUBE operátory
Agregace dat ROLLUP a CUBE operátory 291

292 DBI026 -DB Aplikace - MFF UK
Agregace dat Pro jednoduché agregace dat v SQL slouží klauzule GROUP BY a HAVING spolu s agregačními funkcemi MIN, MAX, AVG, COUNT, COUNT DISTINCT, … Vytvářejí z řádků databáze skupiny se shodnými hodnotami v dané množině sloupců Pro tyto skupiny počítají agregované hodnoty Jedna skupina řádek vytvoří v agregovaném výsledku jednu řádku DBI026 -DB Aplikace - MFF UK 292

293 DBI026 -DB Aplikace - MFF UK
Agregace dat Sloupce, podle kterých se data seskupují nejsou v řadě případů nezávislé, ale tvoří hierarchii Př.: řetězec obchodů, evidující prodeje zboží: sloupce: Kraj, Město, Pobočka, Prodavač tvoří postupné zpřesnění místa prodeje Pro management je žádoucí znát obraty pro jednotlivé kraje, města, pobočky i jednotlivé prodavače DBI026 -DB Aplikace - MFF UK 293

294 DBI026 -DB Aplikace - MFF UK
Agregace dat Jednou z možností je vygenerování výstupu pomocí několika agregovaných dotazů a jejich spojení pomocí UNION ALL SELECT Kraj, Mesto, Pobocka, Prodavac, SUM(Cena) FROM Prodeje GROUP BY Kraj, Mesto, Pobocka, Prodavac UNION ALL SELECT Kraj, Mesto, Pobocka, NULL, SUM(Cena) FROM Prodeje GROUP BY Kraj, Mesto, Pobocka UNION ALL … DBI026 -DB Aplikace - MFF UK 294

295 DBI026 -DB Aplikace - MFF UK
GROUP BY ROLLUP SQL-92 Entry definuje rozšíření klauzule GROUP BY ROLLUP (sloupec1, sloupec2, …) která vytváří agregace pro vyšší úrovně automaticky v jediném dotazu Snadná formulace dotazu Zajištění konzistence výsledku (původní varianta nemusí při ISOLATION LEVEL < SERIALIZABLE počítat agregace v jednotlivých poddotazech nad stejnými daty) DBI026 -DB Aplikace - MFF UK 295

296 DBI026 -DB Aplikace - MFF UK
GROUP BY ROLLUP Pro GROUP BY ROLLUP nad k sloupci se pro každou místo jedné skupiny vytvoří k+1 řádek s agregacemi pro prvních k, k-1, k-2, ..., 0 sloupců DBI026 -DB Aplikace - MFF UK 296

297 DBI026 -DB Aplikace - MFF UK
GROUP BY ROLLUP SELECT Kraj, Mesto, Pobocka, Prodavac, SUM(Cena) FROM Prodeje GROUP BY ROLLUP ( Kraj, Mesto, Pobocka, Prodavac ); KRAJ MESTO POBOCKA PRODAVAC SUM(CENA) Praha Praha Karlín Novák Praha Praha Karlín Dvořák Praha Praha Karlín Praha Praha Smíchov Malá Praha Praha Smíchov Praha Praha … DBI026 -DB Aplikace - MFF UK 297

298 DBI026 -DB Aplikace - MFF UK
Agregace dat Pokud sloupce naopak jsou nezávislé, je v některých případech žádoucí spočítat součty pro všechny podmnožiny sloupců Př.: řetězec obchodů, evidující prodeje zboží: sloupce: Kraj, TypZboží Potřebujeme znát objemy prodejů jednotlivých typů zboží v jednotlivých krajích, stejně jako prodejnost zboží bez ohledu na kraj, prodejnost v krajích bez ohledu na typ zboží, a celkový obrat firmy DBI026 -DB Aplikace - MFF UK 298

299 DBI026 -DB Aplikace - MFF UK
Agregace dat Generovat výsledky pomocí více dotazů je neefektivní, pro k sloupců je potřebné spočítat výsledky pro všech 2k podmnožin DBI026 -DB Aplikace - MFF UK 299

300 DBI026 -DB Aplikace - MFF UK
GROUP BY CUBE Generovat výsledky pomocí více dotazů je neefektivní, pro k sloupců je potřebné spočítat výsledky pro všech 2k podmnožin SQL-92 Entry definuje rozšíření klauzule GROUP BY CUBE (sloupec1, sloupec2, …) která vytváří agregace pro podskupiny automaticky v jediném dotazu DBI026 -DB Aplikace - MFF UK 300

301 DBI026 -DB Aplikace - MFF UK
GROUP BY CUBE SELECT Kraj, TypZbozi, SUM(Cena) FROM Prodeje GROUP BY CUBE (Kraj, TypZbozi); KRAJ TYPZBOZI SUM(CENA) Praha Elektro Praha Potraviny Kladno Elektro Liberec Potraviny Praha Elektro … DBI026 -DB Aplikace - MFF UK 301

302 DBI026 -DB Aplikace - MFF UK
GROUP BY GROUPING SETS Oracle obsahuje rozšíření GROUP BY GROUPING SETS, Které dovoluje určit jen vybrané podmnožiny sloupců, pro které se agregace počítají SELECT Sloupec1, Sloupec2, Sloupec3, … FROM Tabulka GROUP BY GROUPING SETS( (Sloupec1, Sloupec2, Sloupec3), (Sloupec1, Sloupec2), (Sloupec2, Sloupec3) ); DBI026 -DB Aplikace - MFF UK 302

303 DBI026 -DB Aplikace - MFF UK
GROUPING, GROUPING_ID Funkce GROUPING(sloupec)  {0,1} vrací informaci, zda se podle daného sloupce v daném řádku provádělo seskupování, či nikoli Funkce GROUPING_ID  N vrací bitovou mapu sloupců podle kterých se v dané řádce výsledku data seskupovala DBI026 -DB Aplikace - MFF UK 303

304 Fulltextové vyhledávání
Přednáška č. 7 Fulltextové vyhledávání Filtrace, Disambiguace, Lemmatizace, Indexy, Tezaury, Dotazování 304

305 Fulltextové vyhledávání
Odlišné od principů běžného vyhledávání Neprohledávají se striktně strukturovaná data, kde má každý sloupec každé tabulky předem daný význam Prohledávají se volně psané texty, kde může být stejná událost popsaná více autory rozdílně Různá slova stejného významu (Synonyma) Různé slovní obraty a opisy DBI026 -DB Aplikace - MFF UK 305

306 Fulltextové vyhledávání
Databázové systémy využívají svých prostředků rozšiřitelnosti a dodávají standardně prostředky, které vyhledávání v textových datech umožňují DBI026 -DB Aplikace - MFF UK 306

307 Fulltextové vyhledávání
Standard: SQL/MM 2 SQL Multimedia and Application Packages Part 2: Full-Text Reálně rozdílné přístupy a možnosti Neexistuje objektivně nejlepší řešení Výsledky navíc podléhají subjektivním názorům tazatelů DBI026 -DB Aplikace - MFF UK 307

308 DBI026 -DB Aplikace - MFF UK
Porozumění textu Posloupnost slov v přirozeném jazyce. Každé slovo zastupuje pro autora nějakou představu, kterou v něm slovo vyvolá - význam. Tyto představy reprezentují reálné předměty. ... DBI026 -DB Aplikace - MFF UK 308

309 DBI026 -DB Aplikace - MFF UK
Porozumění textu Synonymie slov Více slov může mít pro autora stejný význam krychle = kostka buldozer = nakladač ... DBI026 -DB Aplikace - MFF UK 309

310 DBI026 -DB Aplikace - MFF UK
Porozumění textu Homonymie slov Jedno slovo může mít pro autora několik významů taška: střešní, nákupní koruna: platidlo, královská k., k. stromu třída: školní, kategorie v teorii množin los: zvíře, poukázka ke slosování ... DBI026 -DB Aplikace - MFF UK 310

311 DBI026 -DB Aplikace - MFF UK
Porozumění textu Homonymie slov Jedno slovo může používat stejný tvar pro různé pády a další gramatické jevy (gramatická homonymie) kontroly: 1. p. m.č., 2. p. j.č. není zřejmé, zda se jedná o jednu, nebo více kontrol Jeden tvar slova může mít různý význam plesy: podst. jm. ples, podst. jm. pleso žena: podst. jm. žena, sloveso hnát hnát: sloveso hnát, podst. jm. hnát tři: číslovka tři, sloveso třít pět: číslovka pět, sloveso pět DBI026 -DB Aplikace - MFF UK 311

312 DBI026 -DB Aplikace - MFF UK
Porozumění textu Významy slov se mohou překrývat. Hierarchicky zvíře > kůň > hřebec Asociace kalkulátor ~ počítač ~ procesor ... DBI026 -DB Aplikace - MFF UK 312

313 DBI026 -DB Aplikace - MFF UK
Porozumění textu Jednotlivá přiřazení jsou navíc závislá na subjektu, který dokument píše nebo čte. Dva lidé mohou jednomu slovu přikládat zcela nebo jen částečně jiný význam. Dva lidé si i pod stejným významem mohou představit jiný konkrétní předmět nebo množinu předmětů. máma, pokoj, ... Výsledkem je situace, kdy dva různí čtenáři nemusí přečtením získat stejnou informaci jako autor, ani navzájem. DBI026 -DB Aplikace - MFF UK 313

314 DBI026 -DB Aplikace - MFF UK
Porozumění textu Homonymie a nejednoznačnosti narůstají při přechodu od slov k větám. Homonymie vlastních jmen na začátku věty Dohnal zvítězil. (srov. Čtrnáctý zvítězil.) Plk. Dohnal předešel gen. Kvapila velmi výrazně. - jedna, dvě, nebo tři věty? Homonymie spojky a v předmětu věty Funkce rezistoru a zesilovače v radiotechnice. (funkce rezistoru v radiotechnice) a (funkce zesilovače v radiotechnice) (funkce rezistoru) a (funkce zesilovače v radiotechnice) (funkce rezistoru) a (zesilovače v radiotechnice) Homonymie podmětu a předmětu Popílek přikryl sníh. – co leží navrchu? DBI026 -DB Aplikace - MFF UK 314

315 DBI026 -DB Aplikace - MFF UK
Porozumění textu Příklad české věty s více gramaticky možnými významy viz např. Podivné fungování gramatiky, věta „Ženu holí stroj“ může - podle volby přísudku ve větě - znamenat: Poháním stroj pomocí hole (hnát) Žena používá depilační přístroj (holit) Návod k nekonvenčnímu způsobu oblékání (strojit) … a další Oblékej ženu, patřící holím, Ženu stroj, patřící holím DBI026 -DB Aplikace - MFF UK 315

316 DBI026 -DB Aplikace - MFF UK
Porozumění textu Příklad anglické věty s více gramaticky možnými významy viz např. Podivné fungování gramatiky, věta „Time flies like an arrow“ může - podle volby přísudku ve větě - znamenat: Čas letí jako voda (fly) Časové mouchy/zipy mají rády šíp (like) … a další DBI026 -DB Aplikace - MFF UK 316

317 Fulltextové vyhledávání
Samotná formulace dotazu, který by vrátil všechny dokumenty, které tazatele zajímají a žádné jiné obvykle nelze zformulovat Spolu s vyhovujícími – relevantními – odpověďmi se obvykle vrací i odpovědi nerelevantní DBI026 -DB Aplikace - MFF UK 317

318 Fulltextové vyhledávání
Problémy Homonyma Ptá se tazatel dotazem „koruna“ na finanční, lesnické či panovnické dokumenty? Synonyma Vyhovuje dokument o „krychlích“ dotazu na dokumenty o „kostkách“? Vyhovuje dokument o „stromech“ dotazu na „souvislé grafy bez cyklů“? DBI026 -DB Aplikace - MFF UK 318

319 Fulltextové vyhledávání
Problémy Hierarchie významů Zvíře – Savec – Šelma – Medvěd Tiskovina – Časopis Ohebnost slov Jít, Jde, Jdu, Jdou, … DBI026 -DB Aplikace - MFF UK 319

320 Fulltextové vyhledávání
Striktní boolská logika není pro formulaci dotazů příliš vhodná Dokument buďto vyhovuje dotazu, nebo nevyhovuje Dotazování v textech vyžaduje třídit odpovědi podle předpokládané vhodnosti pro tazatele Je potřebné mít možnost definovat míru shody dotazu s dokumentem DBI026 -DB Aplikace - MFF UK 320

321 DBI026 -DB Aplikace - MFF UK
Přesnost a úplnost Dva DIS mohou vrátit na shodný dotaz různé odpovědi, které se nemusí překrývat ani v jediném vráceném dokumentu Jak porovnat kvalitu odpovědí navzájem? Dokumenty v databázi Relevantní dokumenty Vrácené v DIS1 Vrácené v DIS2 DBI026 -DB Aplikace - MFF UK 321

322 DBI026 -DB Aplikace - MFF UK
Přesnost a úplnost Dva tazatelé mohou mít při položení shodného dotazu různý názor na relevanci vrácených dokumentů Jak vyhovět subjektivnímu názoru tazatelů? Dokumenty v databázi Relevantní Vrácené dok. DBI026 -DB Aplikace - MFF UK 322

323 DBI026 -DB Aplikace - MFF UK
Přesnost a úplnost Kvalita výsledné množiny dokumentů se měří na základě těchto čísel Přesnost (Precision) P = Nvr / Nv Pravděpodobnost, že dokument zařazený v odpovědi je skutečně relevantní Úplnost (Recall) R = Nvr / Nr Pravděpodobnost, že skutečně relevantní dokument je zařazený v odpovědi DBI026 -DB Aplikace - MFF UK 323

324 DBI026 -DB Aplikace - MFF UK
Přesnost a úplnost Koeficienty jsou opět závislé na subjektivním názoru tazatele Dokument vrácený na výstupu může uspokojovat požadavky dvou uživatel, kteří položili stejný dotaz, různou měrou. DBI026 -DB Aplikace - MFF UK 324

325 DBI026 -DB Aplikace - MFF UK
Přesnost a úplnost V ideálním případě P=R=1 V odpovědi jsou zařazeny právě a pouze všechny relevantní dokumenty V běžném případě Odpověď na první verzi dotazu není ani přesná, ani úplná 1 Optimum Počáteční odpověď 1 DBI026 -DB Aplikace - MFF UK 325

326 DBI026 -DB Aplikace - MFF UK
Přesnost a úplnost Ladění dotazu Postupná modifikace dotazu s cílem zvýšit kvalitu odpovědi Teoreticky je sice možné dosáhnout optima, ale … R 1 Optimum P 1 DBI026 -DB Aplikace - MFF UK 326

327 DBI026 -DB Aplikace - MFF UK
Přesnost a úplnost … vlivem víceznačností jsou v praxi oba koeficienty na sobě nepřímo závislé, tj. P*R  konst. < 1 Při snaze zvýšit P se na výstup dostane méně relev. dokumentů. Při snaze zvýšit R se na výstup dostane s více relev. dok. i mnohem více těch nerelevantních. R 1 Optimum P 1 DBI026 -DB Aplikace - MFF UK 327

328 DBI026 -DB Aplikace - MFF UK
Kritérium predikce Při formulaci dotazů je potřebné uhádnout, které termy (slova) byly v dokumentu autorem použity pro vyjádření dané myšlenky Problémy m.j. způsobují Synonyma (autor mohl použít synonymum, které si tazatel při formulaci dotazů ani nemusí neuvědomí) Překrývající se významy slov Opisy jedné situace jinými slovy DBI026 -DB Aplikace - MFF UK 328

329 DBI026 -DB Aplikace - MFF UK
Kritérium predikce Částečným řešením je zařazení tezauru, který obsahuje Hierarchie slov a jejich významů Synonyma slov Asociace mezi slovy Tazatel může tezaurus využít při formulaci svých dotazů DBI026 -DB Aplikace - MFF UK 329

330 DBI026 -DB Aplikace - MFF UK
Kritérium predikce Při ladění dotazů má uživatel tendenci postupovat konzervativně V dotazu zůstávají často ty jeho části, které uživatele napadly na začátku a mění se jen podružné části, které nekvalitní výsledek nemusí nijak zásadně ovlivnit Vhodné je uživateli pomoci s odstraněním nevhodných částí dotazu, které nepopisují relevantní dokumenty a naopak s přidáváním formulací, které relevantní dokumenty popisují DBI026 -DB Aplikace - MFF UK 330

331 DBI026 -DB Aplikace - MFF UK
Kritérium maxima Tazatel obvykle není schopen (nebo ochoten) procházet příliš mnoho dokumentů do té míry, aby se rozhodl, zda jsou pro něj relevantní nebo ne Obvykle podle velikosti Potřeba nejen dokumenty rozlišovat na odpovídající/neodpovídající dotazu, ale řadit je na výstupu podle míry předpokládané relevance DBI026 -DB Aplikace - MFF UK 331

332 DBI026 -DB Aplikace - MFF UK
Kritérium maxima V důsledku kritéria maxima se při ladění dotazu uživatel obvykle snaží zvýšit přesnost Malé množství dokumentů v odpovědi, obsahující co největší poměr relevantních dokumentů Některé oblasti použití vyžadují co nejvyšší přesnost i úplnost Právnictví „lepší“ Vr. Rel. „horší“ Vr. Rel. DBI026 -DB Aplikace - MFF UK 332

333 Obvyklý postup předzpracování
Databáze obvykle používají některý z boolských modelů reprezentace dokumentů Nejlépe odpovídá běžným dotazům Relativně snadno se implementuje Dotazy jsou ve formě boolských formulí, ve kterých operandy tvoří jednotlivá slova Řada různých modifikací DBI026 -DB Aplikace - MFF UK 333

334 Obvyklý postup předzpracování
Filtrace Lemmatizace Desambiguace Seznam lemmat Tezaurus Stoplist Lemm. text Invertovaný seznam Indexace Invertovaný seznam DBI026 -DB Aplikace - MFF UK 334

335 Obvyklý postup předzpracování
Filtrace Odstraní formátovací značky a nechá čistý ASCII text Desambiguace Určí význam slova podle kontextu „pět chválu“ … sloveso pět „pět vozidel“ … číslovka pět Lemmatizace Určí základní tvar slova a gramatický tvar v dokumentu Často nahrazen pomocí stemmeru, který hledá kmen slova DBI026 -DB Aplikace - MFF UK 335

336 Obvyklý postup předzpracování
Indexace Vytvoří pomocné seznamy lemmat a dokumentů a invertovaný soubor dvojice [id_dok,id_lemmatu] setříděné dle id_lemmatu a zbavené duplicit dnes obvykle více informací, např. pětice [id_dok,č_odstavce,č_věty,č_slova,id_lemmatu] setříděné id_lemmatu Dovoluje vyhodnocování tzv. proximitních omezení na vzdálenost slov v dokumentu DBI026 -DB Aplikace - MFF UK 336

337 Fulltextové vyhledávání
Pro podporu vyhledávání je potřeba nad textovým sloupcem vytvořit index – invertovaný soubor Běžné textové sloupce jsou pro tyto účely krátké a nevyhovující Obvykle se takto indexují sloupce některého z LOB (Large OBject) typů DBI026 -DB Aplikace - MFF UK 337

338 DBI026 -DB Aplikace - MFF UK
Large OBjects (LOB) LOBy Standardní typy pro ukládání objemných dat na serveru definován v SQL-92 Full Až 4GB dat BLOB … standardní binární typ CLOB … znakový typ v univerzální znakové sadě serveru NCLOB … znakový typ v národní znakové sadě serveru V Oracle navíc externí typ BFILE pouze pro čtení samostatný binární soubor uložený vně databáze v OS DBI026 -DB Aplikace - MFF UK 338

339 DBI026 -DB Aplikace - MFF UK
Large OBjects (LOB) LOBy Standardní typy pro ukládání objemných dat na serveru definován v SQL-92 Full Až 4GB dat BLOB … standardní binární typ CLOB … znakový typ v univerzální znakové sadě serveru NCLOB … znakový typ v národní znakové sadě serveru V MS SQL Image … binární data do velikosti 2 GB Text … textová data do velikosti 2 GB NText … textová data v národní znakové sadě do vel. 1 GB DBI026 -DB Aplikace - MFF UK 339

340 DBI026 -DB Aplikace - MFF UK
Large Objects Ve sloupcích tabulky je uložen pouze deskriptor (tzv. LOB lokátor), odkazující na samotně uložená data DBI026 -DB Aplikace - MFF UK 340

341 Struktura MS SQL full-text
DBI026 -DB Aplikace - MFF UK 341

342 DBI026 -DB Aplikace - MFF UK
MS SQL fulltext Vytvoření indexu nad textovým sloupcem CREATE FULLTEXT INDEX ON table_name [(column_name [TYPE COLUMN type_column_name] [LANGUAGE language_term] [,...n])] KEY INDEX index_name [ON fulltext_catalog_name] [WITH {CHANGE_TRACKING {MANUAL | AUTO | OFF [, NO POPULATION]}} ] DBI026 -DB Aplikace - MFF UK 342

343 DBI026 -DB Aplikace - MFF UK
MS SQL fulltext Potřebné zadat Jméno tabulky, jméno textového sloupce typu char, nchar, varchar, nvarchar, text, ntext Jméno (co nejmenšího) unikátního indexu nad tabulkou v klauzuli KEY INDEX DBI026 -DB Aplikace - MFF UK 343

344 DBI026 -DB Aplikace - MFF UK
MS SQL fulltext Z dalších možností: Definice jazyka (LANGUAGE) Způsob aktualizace WITH CHANGE_TRACKING MANUAL … vytváření žurnálu změn v datech, jeho promítnutí do indexu se může provést ručně, nebo automaticky schedulerem AUTO … index se bude aktualizovat zároveň s daty OFF … index se nebude aktualizovat vůbec DBI026 -DB Aplikace - MFF UK 344

345 DBI026 -DB Aplikace - MFF UK
MS SQL fulltext Příklad vytvoření indexu: USE AdventureWorks; GO CREATE UNIQUE INDEX ui_ukJobCand ON HumanResources.JobCandidate(JobCandidateID); CREATE FULLTEXT CATALOG ft AS DEFAULT; CREATE FULLTEXT INDEX ON HumanResources.JobCandidate(Resume) KEY INDEX ui_ukJobCand; GO DBI026 -DB Aplikace - MFF UK 345

346 Struktura Oracle full-text
DBI026 -DB Aplikace - MFF UK 346

347 DBI026 -DB Aplikace - MFF UK
Oracle fulltext Filtrování vstupních dokumentů NULL_FILTER pro textové dokumenty TXT, HTML, XML INSO_FILTER pro binární dokumenty CHARSET_FILTER pro konverzi získaných dokumentů do znakové sady databáze DBI026 -DB Aplikace - MFF UK 347

348 DBI026 -DB Aplikace - MFF UK
Oracle fulltext Druhy fulltextových indexů CONTEXT Základní typ indexu pro vyhledávání v textových datech Vhodný pro větší dokumenty Synchronizace indexu s daty je nutné provést explicitně zavoláním CTX_DDL.SYNC_INDEX (obdoba WITH CHANGE_TRACKING MANUAL z MS SQL) DBI026 -DB Aplikace - MFF UK 348

349 DBI026 -DB Aplikace - MFF UK
Oracle fulltext Druhy fulltextových indexů CTXCAT Vhodný pro menší dokumenty a jejich úryvky Může být zkombinován s dalšími netextovými sloupci pro kombinované dotazování Synchronizace indexu s daty se provádí automaticky se změnami v tabulce (obdoba WITH CHANGE_TRACKING AUTO z MS SQL) DBI026 -DB Aplikace - MFF UK 349

350 DBI026 -DB Aplikace - MFF UK
Oracle fulltext Druhy fulltextových indexů CTXRULE Postaven na množině předdefinovaných dotazů Slouží pro klasifikaci dokumentů do skupin podle toho, kterým dotazům vyhovuje DBI026 -DB Aplikace - MFF UK 350

351 DBI026 -DB Aplikace - MFF UK
Oracle fulltext Uložení dokumentů NORMAL_DATASTORE Text je v jednom sloupci jednoho řádku MULTI_COLUMN_DATASTORE Text je ve více sloupcích jednoho řádku URL_DATASTORE Text je na Internetu, dostupný přes URL ve sloupci DBI026 -DB Aplikace - MFF UK 351

352 DBI026 -DB Aplikace - MFF UK
Oracle fulltext Vytvoření indexu nad textovým sloupcem CREATE INDEX index_name ON table_name(column_name) INDEXTYPE IS ctxsys.{context|ctxcat|ctxrule} [PARAMETERS (’param_name param_value …’)]; DBI026 -DB Aplikace - MFF UK 352

353 DBI026 -DB Aplikace - MFF UK
Oracle fulltext Potřebné zadat Jméno tabulky, jméno textového sloupce typu char, nchar, varchar2, nvarchar2, clob, nclob Typ indexu DBI026 -DB Aplikace - MFF UK 353

354 DBI026 -DB Aplikace - MFF UK
Oracle fulltext Z dalších možností: Filter … formát vstupních dat Lexer … členění textu na slova s ohledem na jazyk, diakritiku a její přepisy (ö, oe, o), … Datastore Stoplist, DBI026 -DB Aplikace - MFF UK 354

355 DBI026 -DB Aplikace - MFF UK
Oracle fulltext Příklad vytvoření indexu: CREATE INDEX myindex ON doc(htmlfile) INDEXTYPE IS ctxsys.context PARAMETERS( ’datastore ctxsys.default_datastore filter ctxsys.null_filter section group ctxsys.html_section_group’); DBI026 -DB Aplikace - MFF UK 355

356 Dotazování se nad textovým indexem
Spolu s novými typy indexů databáze implementují nové operátory pro porovnávání dotazu s textem Operátory vrací číslo – očekávanou míru shody obsahu textu s tazatelovými požadavky DBI026 -DB Aplikace - MFF UK 356

357 Dotazování se nad textovým indexem
MS SQL používá boolský operátor – predikát CONTAINS( sloupec, ’dotaz’[, LANGUAGE jazyk ]) DBI026 -DB Aplikace - MFF UK 357

358 Dotazování se nad textovým indexem
Oracle používá numerickou funkci CONTAINS( sloupec, ’dotaz’[, číslo_porovnání ]) Pomocí SCORE(číslo_porovnání) lze v SELECT části zjistit hodnotu operátoru DBI026 -DB Aplikace - MFF UK 358

359 Dotazování se nad textovým indexem
Operátory pro dotazování AND, & … ‘mice & cats’ OR, | … ‘mice | cats’ AND NOT, & ! … ‘mice AND NOT cats’ NEAR, ~ … proximitní dotazování ‘mice NEAR cats’ DBI026 -DB Aplikace - MFF UK 359

360 Dotazování se nad textovým indexem
Operátory pro dotazování Fráze v uvozovkách FORMSOF ( INFLECTIONAL , slovo) slovo se hledá ve všech tvarech hide, hidden, … FORMSOF ( THESAURUS , slovo) slovo se rozvine pomocí tezauru pro daný jazyk na seznam slov s podobným významem DBI026 -DB Aplikace - MFF UK 360

361 Dotazování se nad textovým indexem
Operátory pro dotazování Začátek slova následovaný hvězdičkou pro hledání všech slov začínajících prefixem ISABOUT ( slovo WEIGHT (n) [,…]) Vážený term, vhodný pro dotazy s využitím operátoru CONTAINSTABLE DBI026 -DB Aplikace - MFF UK 361

362 Dotazování se nad textovým indexem
CONTAINSTABLE( tabulka,sloupec,dotaz[,jazyk][,top_n] ) Vrací tabulku hodnot shody sloupce tabulky s dotazem. Ohodnocení je v pseudo sloupci RANK DBI026 -DB Aplikace - MFF UK 362

363 Dotazování se nad textovým indexem
SELECT select_list FROM table AS FT_TBL INNER JOIN CONTAINSTABLE(table, column, query) AS KEY_TBL ON FT_TBL.unique_key_column = KEY_TBL.[KEY] DBI026 -DB Aplikace - MFF UK 363

364 Dotazování se nad textovým indexem
SELECT FT_TBL.CategoryName, FT_TBL.Description, KEY_TBL.RANK FROM Categories AS FT_TBL INNER JOIN CONTAINSTABLE(Categories, Description, 'ISABOUT (breads weight (.8), fish weight (.4), beers weight (.2) )' ) AS KEY_TBL ON FT_TBL.CategoryID = KEY_TBL.[KEY] ORDER BY KEY_TBL.RANK DESC DBI026 -DB Aplikace - MFF UK 364

365 Dotazování se nad textovým indexem
SELECT FT_TBL.Description, FT_TBL.CategoryName , KEY_TBL.RANK FROM Categories AS FT_TBL INNER JOIN CONTAINSTABLE (Categories, Description, '("sweet and savory" NEAR sauces) OR ("sweet and savory" NEAR candies)', 10) AS KEY_TBL ON FT_TBL.CategoryID = KEY_TBL.[KEY] DBI026 -DB Aplikace - MFF UK 365

366 Dotazování se nad textovým indexem
Operátory pro dotazování AND, & … ‘mice & cats’ OR, | … ‘mice | cats’ NOT, ~ … ‘mice ~ cats’ NEAR, ; … proximitní dotazování ‘mice ; cats’ NEAR((mice,cats),5) DBI026 -DB Aplikace - MFF UK 366

367 Dotazování se nad textovým indexem
Operátory pro dotazování ABOUT ( téma ) dokumenty pojednávající o tématu ‘about(politics)’ WEIGHT, * vynásobí skóre výrazu danou konstantou STEM, $ nalezne termy se stejným slovním základem DBI026 -DB Aplikace - MFF UK 367

368 Dotazování se nad textovým indexem
Operátory pro dotazování Na začátku / konci slova je možné uvést zástupné symboly _ a % dotaz WITHIN PARAGRAPH dotaz WITHIN SENTENCE Hledání v rámci odstavce, věty DBI026 -DB Aplikace - MFF UK 368

369 Dotazování se nad textovým indexem
SELECT nazev, SCORE(1)+SCORE(2) FROM dokument WHERE CONTAINS(abstrakt,’database & search’,1) > 0 AND CONTAINS( text, ’(object|relational) NEAR database’, 2) > 0 DBI026 -DB Aplikace - MFF UK 369

370 Dotazování se nad textovým indexem
Využití tezauru BT(slovo[,n]) … zahrnout i širší term pro slovo pokud je slovo homonymní, zahrnout všechny NT(slovo[,n]) … zahrnout i užší termy pro slovo PT(slovo) … nahradit preferovaným termem pro slovo TT(slovo) … nahradit nejširším termem pro slovo SYN(slovo) … zahrnout i synonyma pro slovo DBI026 -DB Aplikace - MFF UK 370

371 DBI026 -DB Aplikace - MFF UK
Synonyma v Oracle Vytvoření CREATE [PUBLIC] SYNONYM jmeno FOR [schema.]stare_jmeno; Zrušení DROP [PUBLIC] SYNONYM jmeno; Všude, kde lze použít původní název, lze použít nové jméno Lze vytvářet synonyma téměř ke všemu včetně synonym Veřejná synonyma vidí všichni bez prefixu vlastníka DBI026 -DB Aplikace - MFF UK 371

372 Využití XML v DB aplikacích
372

373 Komunikace aplikace s okolím
Databázová aplikace potřebuje často komunikovat s dalšími informačními systémy Export podkladů z IS pro externí účetnictví B2G (business-to-government) Export výkazů pro státní správu B2B (business-to-business) Import údajů z IS jiných firem Elektronické objednávky SOA service-oriented architecture Komunikace mezi jednotlivými komponentami DBI026 -DB Aplikace - MFF UK 373

374 Komunikace aplikace s okolím
Pro komunikaci se ve stále větší míře používá XML formát dat Čitelný i pro lidskou obsluhu aplikací Strukturovaný Snadno parsovatelný Velký objem dat Přímé dotazování nad XML daty vyžaduje zcela odlišné nástroje a datové struktury, než relační databází DBI026 -DB Aplikace - MFF UK 374

375 DBI026 -DB Aplikace - MFF UK
XML a relační databáze Pro komunikaci databázové aplikace s okolím je proto často potřebné Exportovat uložená relační data do XML Získat informace uložené v uzlech XML stromu a uložit je do relačních tabulek Ukládat původní XML dokumenty, získané od obchodních partnerů Vyhledávat XML dokumenty obsahující dané informace DBI026 -DB Aplikace - MFF UK 375

376 Adresování dat v XML - XPath
XPath je jedním z často používaných dotazovacích jazyků nad XML Výsledkem dotazu je množina uzlů či atributů, které vyhovují zadané podmínce Dokument je chápán jako strom, obsahující Kořenový uzel (není součástí dokumentu) Elementy Atributy Textové uzly (listy, odpovídají volnému textu mezi uzly) … (komentáře, jmenné prostory, instrukce pro zpracování) DBI026 -DB Aplikace - MFF UK 376

377 Adresování dat v XML - XPath
Cesta je základním prostředkem pro adresaci uzlu či uzlů ve stromě Absolutní začínají znakem ’/’ Relativní Zapisuje se jako seznam kroků, oddělených lomítky. DBI026 -DB Aplikace - MFF UK 377

378 Adresování dat v XML - XPath
Příklady Xpath dotazů /knihy/kniha/nazev seznam všech elementů nazev, které jsou přímým potomkem elementu kniha, který je přímým potomkem kořenového elementu knihy. //nazev seznam všech elementů nazev v XML stromu, nacházejících se na libovolných cestách DBI026 -DB Aplikace - MFF UK 378

379 Adresování dat v XML - XPath
Příklady Xpath dotazů /knihy/*/nazev na druhém kroku cesty může být libovolný element /knihy/kniha[1]/autor[2] druhý autor první knihy v seznamu /knihy/kniha[autor=’Pokorný J.’]/titul tituly všech knih od J. Pokorného DBI026 -DB Aplikace - MFF UK 379

380 Adresování dat v XML - XPath
Osy v XPath self:: - aktuální uzel parent::, child:: - přímý rodič/potomci aktuálního uzlu ancestor::, descendand:: - všichni předci/potomci, včetně nepřímých descendand-or-self::, ancestor -or-self:: following::, preceding:: - uzly před/za aktuálním uzlem a všemi jeho předky following-sibling::, preceding-sibling:: - sourozenci attribute:: - atributy aktuálního uzlu child:: tvoří defaultní osu, nemusí se uvádět DBI026 -DB Aplikace - MFF UK 380

381 Adresování dat v XML - XPath
preceding:: following:: DBI026 -DB Aplikace - MFF UK 381

382 Adresování dat v XML - XPath
Obvykle se využívají zkrácené notace jméno_uzlu místo child::jméno_uzlu @jméno_atributu místo attribute:: jméno_atributu ’.’ pro aktuální uzel ’..’ pro rodičovský uzel DBI026 -DB Aplikace - MFF UK 382

383 Adresování dat v XML - XPath
Příklady dotazů Názvy všech knih /knihy/kniha/nazev/text() První kniha v seznamu /knihy/kniha[1] <kniha><nazev>…</nazev><autor>…</autor></kniha> DBI026 -DB Aplikace - MFF UK 383

384 DBI026 -DB Aplikace - MFF UK
Indexování dat v XML Problémem je efektivita vyhodnocování XPath dotazů, případně dotazů v jiných dotazovacích jazycích nad XML Data mohou být v relační databázi uložena po částech, a využity standardní nástroje (spojení, indexy) Použitelné v libovolné relační databázi Nutná znalost struktury ukládaných dokumentů (DTD, XMLSchema) Data mohou být uložena nativně v podobě textu Nutná podpora speciálních typů indexů DBI026 -DB Aplikace - MFF UK 384

385 Ukládání XML do relačních databází
Pokud je potřeba ukládat XML dokumenty, platné vzhledem ke konkrétnímu DTD, je možné použít několik variant uložení Nástin jednoho z možných řešení: Předpokládá dostatečně jednoduché DTD, nebo vytvoření jednoduššího DTD’, které je méně striktní, než DTD původní, tj.: platnost v DTD  platnost v DTD’ Elementy jmenují jiné elementy ve svém obsahu nejvýše jednou Obsažený element může být nepovinný (?) nebo opakující se (*) Obsažené elementy jsou oddělené pouze čárkou, ne ’|’ Na pořadí elementů nezáleží DBI026 -DB Aplikace - MFF UK 385

386 Ukládání XML do relačních databází
Pro takto zjednodušené DTD je možné vytvořit Seznam možných cest v XML stromu Pro každý element je E vytvořena tabulka, obsahující sloupce pro jednotlivé atributy E(DocID,ElemID,ParID,PathID,atributy) Id dokumentu, Id elementu,sloupce pro uchování atributů, Id rodičovského elementu, Id cesty na které element leží DBI026 -DB Aplikace - MFF UK 386

387 Ukládání XML do relačních databází
<!ELEMENT kniha (titul, autor)> <!ATTLIST kniha isbn CDATA)> <!ELEMENT titul (#PCDATA)> <!ELEMENT autor (#PCDATA)> Kniha(DocID,ElemID,ParID,PathID,ISBN) Titul(DocID,ElemID,ParID,PathID,PCDataId) Autor(DocID,ElemID,ParID,PathID,PCDataId) PCData(DocID,ElemID,Data) DBI026 -DB Aplikace - MFF UK 387

388 Ukládání XML do relačních databází
Dotazy v XPath jsou přeformulovány na SQL Často je nutné spojovat velké množství tabulek. Jejich počet je možné snížit např. tím, že pro podstromy, ve kterých se nemůže vyskytovat opakující se element, se vytvoří jediná tabulka obsahující element a všechny podelementy XML Schema ER/RMD XML Dok. XPath dotaz SQL dotaz Data v RDB Transformace v: Klientské části V některých implementacích relačních databází DBI026 -DB Aplikace - MFF UK 388

389 Ukládání XML do relačních databází
<!ELEMENT kniha (titul, autor)> <!ATTLIST kniha isbn CDATA)> <!ELEMENT titul (#PCDATA)> <!ELEMENT autor (#PCDATA)> Kniha( DocID,ElemID, ISBN, TitulPCDataId, AutorPCDataId, ParID,PathID) PCData(DocID,ElemID,Data) DBI026 -DB Aplikace - MFF UK 389

390 Ukládání XML do relačních databází
<!ELEMENT kniha (titul, autor*)> <!ATTLIST kniha isbn CDATA)> <!ELEMENT titul (#PCDATA)> <!ELEMENT autor (#PCDATA)> Pokud se autor může vícekrát opakovat, je nutné jej uložit do samostatné tabulky, titul ale může být sloučen Kniha( DocID,ElemID,ISBN,TitulPCDataId,ParID,PathID) Autor(DocID,ElemID,ParID,PathID,PCDataId) PCData(DocID,ElemID,Data) DBI026 -DB Aplikace - MFF UK 390

391 DBI026 -DB Aplikace - MFF UK
Indexace XML dat DataGuide index obsahuje strom cest, vyskytujících se v XML dokumentu Každá cesta je vněm uložena právě jednou Uzly obsahují metainformace o uzlech, které dané cestě odpovídají Je možné jej uložit v XML formátu DBI026 -DB Aplikace - MFF UK 391

392 DBI026 -DB Aplikace - MFF UK
Indexace XML dat Index cest v XML Obdoba DataGuide indexu V uzlech obsahuje přímo množiny odkazů na jednotlivé elementy, které cestě odpovídají Výrazně urychluje odpovědi na dotazy ve formě cest bez použití // Přispívá pro vyhodnocení dotazů, které alespoň začínají absolutní cestou, a // obsahují ve větší hloubce DBI026 -DB Aplikace - MFF UK 392

393 DBI026 -DB Aplikace - MFF UK
Indexace XML dat Lore Index VIndex (Value index) - indexuje textové hodnoty uzlů a atributů TIndex (Term index) - indexuje slova v hodnotách elementů LIndex - index pro nalezení otců pro jednotlivé uzly PIndex (Path index) - indexuje cesty a udržuje pro ně množiny odpovídajících uzlů DBI026 -DB Aplikace - MFF UK 393

394 DBI026 -DB Aplikace - MFF UK
Indexace XML dat Lore Index pomocí VIndexu se naleznou atributy stat s hodnotou ”CZ”, pro ně se bottom-up postupem přes LIndex ověří cesta DBI026 -DB Aplikace - MFF UK 394

395 DBI026 -DB Aplikace - MFF UK
Uložení XML dat – MS SQL Nativní datový typ XML CREATE TABLE XmlTab( ID NUMERIC CONSTRAINT XmlTabPk PRIMARY KEY, Dok XML ); INSERT INTO XmlTab VALUES( 1, ’<a><b>b1</b></a>’ ); DBI026 -DB Aplikace - MFF UK 395

396 Uložení XML dat– Oracle
Typ XMLType, který dovoluje dvojí způsob uložení: Pomocí CLOB Dokument je vrácen přesně v původním tvaru včetně bílých znaků (formátování) Není nutné znát XMLSchema Komplikované částečné aktualizace Ve starších verzích pouze full-text indexování DBI026 -DB Aplikace - MFF UK 396

397 Uložení XML dat– Oracle
Typ XMLType, který dovoluje dvojí způsob uložení: Pomocí rozložení do tabulek Je vrácen dokument, shodný s ohledem na DOM, tj. bez zachování bílých znaků (formátování) Je nutné znát a předem v databázi zaregistrovat XMLSchema Efektivní částečné aktualizace Možné indexování i pomocí B-stromů DBI026 -DB Aplikace - MFF UK 397

398 Uložení XML dat – Oracle
Nativní datový typ XMLType CREATE TABLE XmlTab( ID NUMERIC CONSTRAINT XmlTabPk PRIMARY KEY, Dok XMLType ); INSERT INTO XmlTab VALUES( 1, ’<a><b>b1</b></a>’ ); DBI026 -DB Aplikace - MFF UK 398

399 Export tabulky do XML – MS SQL
MS SQL pro export dat z tabulek do XML podoby používá konstrukci SELECT … FOR XML {RAW|AUTO|EXPLICIT|PATH} [,XMLDATA][,ELEMENTS][BINARY BASE64] [ROOT(’korenovy_element’)] DBI026 -DB Aplikace - MFF UK 399

400 Export tabulky do XML – MS SQL
MS SQL pro export dat z tabulek do XML podoby používá konstrukci SELECT … FOR XML {RAW|AUTO|EXPLICIT|PATH} [,XMLDATA][,ELEMENTS][BINARY BASE64] RAW generuje pro každou řádku jeden element row, hodnoty jsou obsažené v atributech elementu, názvy atributů odpovídají názvům sloupců (aliasů) v dotaz <row empno=”1230” ename=”King” deptno=”10” /> <row empno=”4560” ename=”Scott” deptno=”10” /> <row empno=”7800” ename=”King” deptno=”20” /> DBI026 -DB Aplikace - MFF UK 400

401 Export tabulky do XML – MS SQL
AUTO generuje pro každou tabulku v použitém dotazu a řádek jeden element. Struktura odpovídá spojení. Názvy elementů odpovídají názvům tabulek <dept deptno=”10”> <emp empno=”1230” ename=”King” /> <emp empno=”4560” ename=”Scott” /> </dept> <dept deptno=”20”> <emp empno=”7800” ename=”King” deptno=”20” /> </dept> DBI026 -DB Aplikace - MFF UK 401

402 Export tabulky do XML – MS SQL
Modifikátor ELEMENTS zajistí, že hodnoty atributů jsou uloženy jako podelementy, nikoli jako atributy <dept> <deptno>10</deptno> <emp> <empno>1230</empno><ename>King</ename> <empno>4560</empno><ename>Scott</ename> </emp> </dept> <dept deptno=”20”> </dept> DBI026 -DB Aplikace - MFF UK 402

403 Export tabulky do XML – Oracle
Pro export dat do XML lze použít např. funkci SYS_XMLGEN, která jako argument může dostat buďto atomickou hodnotu, nebo strukturovaný uživatelský datový typ SELECT SYS_XMLGEN(ename) FROM … <ENAME>SMITH</ENAME> <ENAME>ALLEN</ENAME> ... DBI026 -DB Aplikace - MFF UK 403

404 Export tabulky do XML – Oracle
SYS_XMLGEN(instance) SELECT SYS_XMLGEN( dept_t(deptno,dname, CAST(MULTISET( select empno, ename from emp e where e.deptno = d.deptno) AS emplist_t))).getClobVal() AS deptxml FROM dept d; <?xml version="1.0"?> <ROW DEPTNO="100"> <DNAME>Sports</DNAME> <EMPLIST> <EMP_T EMPNO="200"> <ENAME>John</ENAME> </EMP_T> <EMP_T> <ENAME>Jack</ENAME> </EMP_T> </EMPLIST> </ROW> DBI026 -DB Aplikace - MFF UK 404

405 Export tabulky do XML – Oracle
XML lze generovat rovněž po částech s použitím řady funkcí. XMLElement( jméno[,atributy][,potomek1, …]] ) XMLAttributes(jm1 AS alias1 [, …]) DBI026 -DB Aplikace - MFF UK 405

406 Export tabulky do XML – Oracle
SELECT XMLElement( ”emp”, XMLAttributes(empno, ename AS name), XMLElement(”salary”, sal), XMLElement(”comm”, comm) ) FROM Emp WHERE empno=1000; <emp empno=”1000” name=”King”> <salary>578</salary> <comm>50</comm> </emp> Každý řádek vygeneruje jednu hodnotu XMLType DBI026 -DB Aplikace - MFF UK 406

407 Export tabulky do XML – Oracle
XMLForest(hodnota1 AS alias1, …) Vygeneruje posloupnost elementů která nemá jediný kořen, nejedná se proto o XML dokument SELECT XMLForest( empno, deptno as name ) FROM emp; <empno>1000</empno><deptno>10</deptno> <empno>2300</empno><deptno>20</deptno> DBI026 -DB Aplikace - MFF UK 407

408 Export tabulky do XML – Oracle
XMLConcat(XML1, …) Sloučí všechny XML dokumenty za sebe, výsledkem nebude XML dokument, protože bude obsahovat více kořenových elementů XMLSequence(fragment) Kolekce XML dokumentů, každý odpovídá jednomu kořenovému elementu ve fragmentu DBI026 -DB Aplikace - MFF UK 408

409 Indexování XML dat – MS SQL
MS SQL dovoluje nad sloupcem typu XML vytvořit tři typy indexů Nejprve je nutné vytvořit primární XML index CREATE PRIMARY XML INDEX XmlIdx ON XmlTab(Dok) Následně lze vytvořit hodnotový index, index cest a index vlastností CREATE XML INDEX jm ON XmlTab(Dok) USING XML INDEX XmlIdx FOR {VALUE|PATH|PROPERTY} DBI026 -DB Aplikace - MFF UK 409

410 Indexování XML dat – Oracle
Oracle dovoluje nad sloupcem typu XML vytvořit indexy: Fulltextový (CTXSYS.Context) CREATE INDEX XmlFtIdx ON XmlTab(Dok) INDEXTYPE IS CTXSYS.Context XMLIndex (CTXSYS.CTXXPath – Oracle 10g) CREATE INDEX XmlPathIdx ON XmlTab(Dok) INDEXTYPE IS CTXSYS.CTXXPath XMLIndex (XDB.XmlIndex – Oracle 11g) CREATE INDEX XmlIdx ON XmlTab(Dok) INDEXTYPE IS XDB.XMLType Indexuje cesty, pozice elementů, hodnoty DBI026 -DB Aplikace - MFF UK 410

411 DBI026 -DB Aplikace - MFF UK
Získání dat z XML Pokud je k dispozici XML dokument s požadavkem na databázovou aplikaci, je potřebné získat z něj potřebné údaje a požadavek vyřídit, nebo data uložit do relační databáze DBI026 -DB Aplikace - MFF UK 411

412 Získání dat z XML – MS SQL
Využívá XPath pro adresaci jednotlivých elementů a jejich množin, případně Xquery pro konstrukci výsledného XML z XML zdrojového xml.Query(dotaz) Vrací fragment, obsahující elementy, vyhovující dotazu Dok.Query(’/kniha/autor’) xml.Exist(dotaz) Vrací 1, pokud ex. alespoň jeden uzel, odpovídající dotazu. Jinak vrací 0 xml.Value(dotaz,typ) Vrací hodnotu odpovídajícího uzlu DBI026 -DB Aplikace - MFF UK 412

413 Získání dat z XML – Oracle
Využívá XPath pro adresaci jednotlivých elementů a jejich množin Extract(xml,xpath) Vrací fragment, obsahující elementy, vyhovující dotazu Extract(xml,’/kniha/autor’) ExistsNode(xml,xpath) Vrací 1, pokud ex. alespoň jeden uzel, odpovídající dotazu. Jinak vrací 0 ExtractValue(xml,xpath) Vrací hodnotu (jediného) odpovídajícího uzlu DBI026 -DB Aplikace - MFF UK 413

414 Získání dat z XML – MS SQL
SELECT dok.Query(’/kniha/autor’) FROM knihy; <autor>Pokorný J.</autor> <autor>Král J.</autor> SELECT dok.Value(’/kniha/autor’,’varchar(30)’) FROM knihy; Pokorný J. Král J. DBI026 -DB Aplikace - MFF UK 414

415 Získání dat z XML – Oracle
SELECT Extract(dok,’/kniha/autor’) FROM knihy; <autor>Pokorný J.</autor> <autor>Král J.</autor> SELECT ExtractValue(dok,’/kniha/autor’) FROM knihy; Pokorný J. Král J. DBI026 -DB Aplikace - MFF UK 415

416 Aktualizace XML - MS SQL
Metoda xml.Modify(’XQuery’) UPDATE Knihy SET seznam=seznam.Modify( ’delete /knihy/kniha[autor=”Kopecký M.”]’ ) WHERE … UPDATE Knihy SET seznam=seznam.Modify( ’insert <kniha><autor>…</autor>…</kniha> into /knihy’) WHERE ... DBI026 -DB Aplikace - MFF UK 416

417 Aktualizace XML - Oracle
Funkce UpdateXML(xml,path1,val1,path2,val2,…) UPDATE Knihy SET seznam=UpdateXML(seznam, ’/kniha[nazev=”DIS”]/autor’,’Pokorný J.’ ) WHERE … DBI026 -DB Aplikace - MFF UK 417

418 Zpřístupnění XML dat – MS SQL
Pomocí nástroje „IIS Virtual Directory Management for SQL Server “ lze definovat v IIS 5 a vyšším adresář, pomocí kterého lze XML data publikovat na webu // * FROM KNIHY FOR XML AUTO&root=knihy DBI026 -DB Aplikace - MFF UK 418

419 Zpřístupnění XML dat – Oracle
Pomocí XML DB repozitory je možné XML dokumenty, uložené v databázi, zveřejnit na webu ve virtuálních adresářích DBI026 -DB Aplikace - MFF UK 419

420 Přístup ke vzdáleným XML zdrojům
HttpUriType Konstruktor HttpUriType(url) Metody GetCLOB() GetBLOB() GetXML() DBI026 -DB Aplikace - MFF UK 420

421 Strukturované typy Pole Hnízděné tabulky
Objektové rozšíření Strukturované typy Pole Hnízděné tabulky 421

422 Objektové rozšíření – SQL:1999
Nové rysy v normě ANSI SQL:1999 Rozšiřitelnost Standardizace typů pro objemná data typ BLOB (Binary Large OBjects) typ CLOB (Character Large OBjects) Možnosti interpretace jejich vnitřního obsahu texty, obrázky, zvuky, videa, ... Možnosti doplňování dalších formátů a manipulace s nimi DBI026 -DB Aplikace - MFF UK 422

423 Objektové rozšíření – SQL:1999
Nové rysy v normě ANSI SQL:1999 Rozšiřitelnost Nové (uživatelské) datové typy - UDT Abstraktní datové typy – ADT Strukturovaná data Řádkové typy Reference DBI026 -DB Aplikace - MFF UK 423

424 Abstraktní datové typy – SQL:1999
Možnost vytvářet vlastní strukturované datové typy zapouzdřující data a operace (například porovnávací operace) Metody psané buďto v SQL, nebo externích jazycích (C, Pascal, …) DBI026 -DB Aplikace - MFF UK 424

425 Abstraktní datové typy – SQL:1999
ADT mohou tvořit hierarchie s jednoduchou dědičností Je podporován polymorfismus metod a dotazů nad daty DBI026 -DB Aplikace - MFF UK 425

426 Abstraktní datové typy – SQL:1999
Příklad ADT CREATE TYPE T_Student AS ( Jm CHAR(30), Adresa CHAR(40), Zac_ studia DATE ) UNINSTANTIABLE NOT FINAL METHOD Poc_Prednasek() RETURNS INTEGER; DBI026 -DB Aplikace - MFF UK 426

427 Abstraktní datové typy – SQL:1999
Pomocí [UN]INSTANTIABLE je možné zakázat či povolit vytváření instancí daného typu V daném příkladu typu T_Student se jedná o abstraktní třídu bez možnosti tvořit instance Pomocí [NOT] FINAL je možné zakázat či povolit vytváření potomků daného typu V případě abstraktních tříd je NOT FINAL předpokladem, bez možnosti vytváření potomků nemá abstraktní třída uplatnění DBI026 -DB Aplikace - MFF UK 427

428 Abstraktní datové typy – SQL:1999
Vytvoření implementace metody se vytváří příkazem CREATE METHOD Poc_Prednasek() FOR T_Student BEGIN … END; DBI026 -DB Aplikace - MFF UK 428

429 Abstraktní datové typy – SQL:1999
Vytvoření odvozeného typu z typu rodičovského se provede příkazem CREATE TYPE T_PhDStudent UNDER T_Student( … ) [UN]INSTANTIABLE [NOT] FINAL …; DBI026 -DB Aplikace - MFF UK 429

430 Abstraktní datové typy – SQL:1999
Vytvoření tabulky instancí abstraktního datového typu CREATE TABLE PhD OF T_PhDStudent; Každá řádka je identifikována pomocí omělého klíče (OID – Object IDentificator) generovaného systémem DBI026 -DB Aplikace - MFF UK 430

431 DBI026 -DB Aplikace - MFF UK
Reference na ADT – SQL:1999 Na instanci abstraktního datového typu je možné se odkázat pomocí nově zavedeného typu reference Pro každý typ T je automaticky definován typ „reference na T“ REF(T) Povolené hodnoty je možné omezit jen na reference do dané tabulky pomocí REF(T) SCOPE Tabulka DBI026 -DB Aplikace - MFF UK 431

432 DBI026 -DB Aplikace - MFF UK
Řádkové typy – SQL:1999 Norma rozlišuje ještě tzv. řádkové typy CREATE ROW TYPE T_Automobil( SPZ VARCHAR(7), Majitel REF(T_Osoba), Typ CHAR(10), Barva CHAR(10), Cena INT ); DBI026 -DB Aplikace - MFF UK 432

433 DBI026 -DB Aplikace - MFF UK
Řádkové typy – SQL:1999 Tabulka instancí řádkových typů CREATE TABLE Automobily OF T_Automobil( CONSTRAINT Automobily_PK PRIMARY KEY(SPZ) ); Instance nejsou identifikovány pomocí OID DBI026 -DB Aplikace - MFF UK 433

434 Použití reference – SQL:1999
Pomocí operátoru -> lze procházet přes jednotlivé reference SELECT SPZ, Majitel->Jmeno, … FROM Automobily WHERE Majitel->RokNar >= 1980; Pokud odkazovaný objekt již neexistuje, je reference ve stavu DANGLING Pro test se používá operátor IS [NOT] DANGLING DBI026 -DB Aplikace - MFF UK 434

435 DBI026 -DB Aplikace - MFF UK
Řádkové typy – SQL:1999 Řádkové typy mohou být použity i pro typy sloupců CREATE TABLE T( … Auto T_Automobil, … ); Mohou být vnořené do sebe Mohou být použity ad-hoc bez předchozí definice typu: Auto ROW(SPZ VARCHAR(7), …) DBI026 -DB Aplikace - MFF UK 435

436 DBI026 -DB Aplikace - MFF UK
Typ pole – SQL:1999 Typ „pole hodnot typu T s maximálním počtem n prvků“ se deklaruje pomocí T ARRAY[n] Např.: Telefony VARCHAR(15) ARRAY[5] DBI026 -DB Aplikace - MFF UK 436

437 Reprezentace tříd bez objektových rozšíření
Uvažujme hierarchii čtyř tříd A, B, C, D viz schéma Používají se tři základní způsoby mapování na relační tabulky Každá má své výhody a nevýhody A aa B bb C cc D dd DBI026 -DB Aplikace - MFF UK 437

438 Reprezentace tříd bez objektových rozšíření
Filtrované (filtered) mapování Jediná tabulka se schématem (ID,aa,bb,cc,dd) Nemusí se dělat žádná spojení Komplikace s NOT NULL, cizími klíči Neefektivní využití místa Problémy s formulací dotazů B C D A DBI026 -DB Aplikace - MFF UK 438

439 Reprezentace tříd bez objektových rozšíření
Horizontální mapování n tabulek se schématy (ID,aa),(ID,aa,bb), (ID,aa,cc),(ID,aa,bb,dd) Každá obsahuje kompletní instance jedné třídy Nemusí se dělat spojení pro získání instancí dané třídy V polymorfních dotazech nutné UNION operace navíc je nutné znát všechny potomky třídy B C D A DBI026 -DB Aplikace - MFF UK 439

440 Reprezentace tříd bez objektových rozšíření
Vertikální mapování n tabulek se schématy (ID,aa),(ID,bb), (ID,cc),(ID,dd) Každá obsahuje kompletní údaje definované v jedné třídě Snadno se definují cizí klíče na danou třídu V polymorfních dotazech nutné spojení se všemi tabulkami nadtříd D C B A DBI026 -DB Aplikace - MFF UK 440

441 DBI026 -DB Aplikace - MFF UK
Objektové rozšíření Proprietární řešení podpory UDT se v jednotlivých databázích značně liší od normy i mezi sebou navzájem V Oracle podpora od verze 8i Strukturované uživatelské typy Od verze 9i včetně jednoduché dědičnosti Pole s proměnnou délkou (VARRAY) Hnízděné tabulky Typ REF DBI026 -DB Aplikace - MFF UK 441

442 DBI026 -DB Aplikace - MFF UK
Objektové rozšíření Proprietární řešení podpory UDT se v jednotlivých databázích značně liší od normy i navzájem V MS SQL podpora od verze SQL Server 2005 Využívá managed kódu .NET platformy DBI026 -DB Aplikace - MFF UK 442

443 Objektové rozšíření MS SQL
Nejprve je nutné napsat definici objektu a metod v některém z .NET jazyků (VB, C#, …) a zkompilovat dll soubor [Serializable] [Microsoft.SqlServer.Server.SqlUserDefinedType(Format.Native,IsByteOrdered=true)] public struct Point : Inullable {…} DBI026 -DB Aplikace - MFF UK 443

444 Objektové rozšíření MS SQL
Dále je nutné zaregistrovat DLL na serveru CREATE ASSEMBLY Point FROM ’\\Comp\Share\Folder\Poind.dll’ WITH PERMISSION_SET = SAFE; DBI026 -DB Aplikace - MFF UK 444

445 Objektové rozšíření MS SQL
Dále je nutné vytvořit odpovídající typ CREATE TYPE Point EXTERNAL NAME Point.[Point]; DBI026 -DB Aplikace - MFF UK 445

446 Objektové rozšíření MS SQL
Typ je možné použít v definici sloupce CREATE TABLE Points ( ID int IDENTITY(1,1) PRIMARY KEY, PointValue Point ) Je možné indexovat buďto binárně přes celý sloupec, nebo přes hodnotu deterministického výrazu nad typem DBI026 -DB Aplikace - MFF UK 446

447 Objektové rozšíření MS SQL
Příklady vkládání dat INSERT INTO Points (PointValue) VALUES (CONVERT(Point, '3,4')); INSERT INTO Points (PointValue) VALUES (CONVERT(Point, '1,5')); INSERT INTO dbo.Points (PointValue) VALUES (CAST ('1,99' AS Point)); DBI026 -DB Aplikace - MFF UK 447

448 Objektové rozšíření MS SQL
Příklady dotazů SELECT ID, CAST(PointValue AS varchar) FROM Points; SELECT ID, CONVERT(varchar, PointValue) FROM Points; SELECT ID, PointValue.X AS xVal, PointValue.Y AS yVal FROM Points; DBI026 -DB Aplikace - MFF UK 448

449 Objektové rozšíření MS SQL
Příklady dotazů s voláním metod V definici třídy musí být zapnuto IsByteOrdered=true SELECT ID, PointValue.ToString() AS Points FROM Points WHERE PointValue > CONVERT(Point, '2,2'); SELECT ID, PointValue.X as X, PointValue.Y as Y, PointValue.DistanceFromXY(1,99) AS Dist FROM dbo.Points WHERE PointValue.Distance() > 10; DBI026 -DB Aplikace - MFF UK 449

450 Objektové rozšíření Oracle strukturované typy
Základní typ bez předků CREATE [OR REPLACE] TYPE t {AS|IS} OBJECT ( definice členských atributů, definice členských metod ) [[NOT] FINAL] [[NOT] INSTANTIABLE] Odvozený typ CREATE [OR REPLACE] TYPE t1 UNDER t (…) …; Implementace metod CREATE [OR REPLACE] TYPE BODY t {AS|IS} implementace členských metod END; Zrušení typu DROP TYPE t; DBI026 -DB Aplikace - MFF UK 450

451 Objektové rozšíření Oracle
Více odpovídá normě SQL:1999 Přesto řada menších i větších rozdílů V definici tříd Nerozlišují se ADT a řádkové typy na vše se používá jednotná deklarace V definici implementací (převzato z definic těl balíků) V definicích polí se používá vlastní syntaxe VARRAY V práci s referencemi DBI026 -DB Aplikace - MFF UK 451

452 Objektové rozšíření Oracle strukturované typy
CREATE TYPE T_Adresa AS OBJECT( Ulice VARCHAR2(50), CP VARCHAR2(10), CO VARCHAR2(10), Mesto VARCHAR2(50), PSC VARCHAR2(5) ); CREATE TYPE T_Osoba AS OBJECT( Jmeno VARCHAR2(50), Prijmeni VARCHAR2(50), Adresa T_Adresa ); DBI026 -DB Aplikace - MFF UK 452

453 Objektové rozšíření Oracle strukturované typy
Použití v tabulkách stejné jako u atomických typů CREATE TABLE Projekty( Nazev VARCHAR2(50) CONSTRAINT Projekt_PK PRIMARY KEY, Vedouci T_Osoba NOT NULL ); Řádky obsahují instance jako své položky Objektové tabulky CREATE TABLE Osoby OF T_Osoba; Řádky jsou instancemi typu, mohou se na ně vytvářet reference DBI026 -DB Aplikace - MFF UK 453

454 Objektové rozšíření Oracle strukturované typy
Implicitní konstruktory: jméno_typu(hodnota,…) T_Adresa(’Krátká’,’2a’,’27’,’Praha 10’,’10000’) T_Osoba(’Jan’,’Nový’, T_Adresa(…)) Použití v SQL INSERT INTO Projekty VALUES( ’Znak’, T_Osoba(’Jan’,’Nový’, T_Adresa(…)) ); INSERT INTO Osoby VALUES( T_Osoba(’Jan’,’Nový’, T_Adresa(…)) ); INSERT INTO Osoby VALUES(’Jan’,’Nový’, T_Adresa(…)); -- Objektovou tabulku lze chápat jako vícesloupcovou tabulku -- obsahující jednotlivé členy samostatně DBI026 -DB Aplikace - MFF UK 454

455 Objektové rozšíření Oracle strukturované typy
Výběr dat SELECT * FROM Osoby; SELECT Jmeno, Prijmeni FROM Osoby; SELECT X.Vedouci FROM Projekty X WHERE X.Vedouci.Prijmeni=’Nový’; SELECT Nazev, X.Vedouci.Prijmeni, X.Vedouci.Adresa.Mesto FROM Projekty X SELECT T_Adresa(Adresa.Ulice, null, null, Adresa.Mesto, null) AS Adr FROM Osoby; DBI026 -DB Aplikace - MFF UK 455

456 Objektové rozšíření Oracle členské funkce a procedury
CREATE TYPE T_Complex AS OBJECT( Re Real, Im Real, MEMBER FUNCTION Abs RETURN Real, MEMBER PROCEDURE SetRe(x Real), MEMBER PROCEDURE SetIm(x Real) ); CREATE TYPE BODY T_Complex AS MEMBER FUNCTION Abs RETURN Real IS BEGIN RETURN SQRT(Re*Re + Im*Im); END; MEMBER PROCEDURE SetRe(x Real) IS BEGIN Re := x; END; MEMBER PROCEDURE SetIm(x Real) IS BEGIN Im := x; END; END; DBI026 -DB Aplikace - MFF UK 456

457 Objektové rozšíření Oracle statické funkce a procedury
CREATE TYPE T_Complex AS OBJECT( Re Real, Im Real, MEMBER FUNCTION Abs RETURN Real, STATIC FUNCTION New(r: Real, i: Real DEFAULT 0) RETURN T_Complex ); CREATE TYPE BODY T_Complex AS … STATIC FUNCTION New(r: Real, i: Real DEFAULT 0) RETURN T_Complex IS BEGIN RETURN T_Complex(r,i); END; DBI026 -DB Aplikace - MFF UK 457

458 Objektové rozšíření Oracle
Členské funkce typu t mají skrytý implicitní IN OUT parametr SELF typu t Volání členských funkcí a procedur musí vždy obsahovat závorky, i když nemají parametry SELECT T_Complex(3,4).Abs() FROM DUAL; Statické funkce a procedury parametr SELF nemají, volají se kvalifikací jménem typu SELECT T_Complex.New(0,1) FROM DUAL; DBI026 -DB Aplikace - MFF UK 458

459 Členské a statické Oracle funkce a procedury - dědičnost
Statické funkce a procedury mohou obsahovat následující modifikátory [[NOT] FINAL] Funkce (ne)lze redefinovat v potomcích [[NOT] INSTANTIABLE] Funkce nemá definovanou implementaci Členské funkce a procedury mohou navíc obsahovat [[NOT] OVERRIDING] Funkce (ne)redefinuje metodu předka Příklad OVERRIDING FINAL MEMBER FUNCTION … DBI026 -DB Aplikace - MFF UK 459

460 Třídění strukturovaných typů Oracle
Typ může definovat právě jednu MAP funkci, nebo právě jednu ORDER funkci. Ne obě. MAP funkce mapuje instance typu na jiný typ s uspořádáním ORDER funkce definuje uspořádání sama CREATE TYPE t AS OBJECT( … MAP MEMBER FUNCTION m RETURN uspoř_typ, ORDER MEMBER FUNCTION o(x: t) RETURN Number Potom a,b typu t platí a < b  a.m() < b.m(), a=b  a.m()=b.m() a < b  a.o(b) < 0, a = b  a.o(b) = 0 DBI026 -DB Aplikace - MFF UK 460

461 Třídění strukturovaných typů Oracle
Způsob uspořádání nemůže být v potomcích změněn z MAP na ORDER ani naopak MAP funkce může být v potomcích redefinována ORDER funkce nemůže být v potomcích redefinována Pokud kořenová třída hierarchie nemá MAP metodu, žádný potomek nemůže třídění dodefinovat DBI026 -DB Aplikace - MFF UK 461

462 Konstruktory typů Oracle
[FINAL] [INSTANTIABLE] CONSTRUCTOR FUNCTION jméno_typu [(SELF IN OUT jméno_typu [, parametr [, …]])] RETURN SELF AS RESULT {IS|AS} … CONSTRUCTOR FUNCTION T_Complex( SELF IN OUT T_Complex, r: Real) RETURN SELF AS RESULT IS BEGIN SELF.Re := r; SELF.Im := 0; RETURN SELF; END; DBI026 -DB Aplikace - MFF UK 462

463 DBI026 -DB Aplikace - MFF UK
Typ VARRAY v Oracle Pole s proměnnou délkou CREATE OR REPLACE TYPE t AS {VARRAY | VARYING ARRAY} (n) OF typ_prvku; Kde n je maximální počet prvků v poli CREATE TYPE T_Telefony AS VARRAY(5) OF VARCHAR2(15); DBI026 -DB Aplikace - MFF UK 463

464 DBI026 -DB Aplikace - MFF UK
Typ VARRAY v Oracle Konstruktor typu VARRAY jméno_typu(hodnota [,…]) Proměnná typu VARRAY např. T_Telefony může nabývat hodnot NULL … prázdná hodnota T_Telefony() … prázdné pole T_Telefony(NULL) … jednoprvkové pole T_Telefony(’ ’, ’ ’) Přístup k i-tému prvku pole tel: T_Telefony v PL/SQL tel(i) DBI026 -DB Aplikace - MFF UK 464

465 DBI026 -DB Aplikace - MFF UK
Typ VARRAY v Oracle Metody typu VARRAY Použitelné jen v PL/SQL, ne SQL společné i pro kolekce, u VARRAY jsou některé funkce zbytečné, protože pole je obsazené hustě bez mezer Exists(k) … TRUE, pokud existuje k-tý prvek pole Count … Počet existujících prvků v poli Limit … Max. možný počet prvků v poli First, Last … Indexy prvního a posledního ex. prvku Prior, Next … Indexy předchozího a následujícího prvku Extend[(n[,i])] … přidá 1 (n) prázdných prvků, resp. kopií i-tého Trim[(n)] … odebere 1 (n) prvků z konce pole DBI026 -DB Aplikace - MFF UK 465

466 Typ TABLE v Oracle kolekce, hnízděné tabulky
Neuspořádaná kolekce s neomezenou délkou CREATE OR REPLACE TYPE t AS TABLE OF typ_prvku; CREATE TYPE Tab_Telefony AS TABLE OF VARCHAR2(15); DBI026 -DB Aplikace - MFF UK 466

467 Typ TABLE v Oracle kolekce, hnízděné tabulky
Konstruktor typu TABLE jméno_typu(hodnota [,…]) Proměnná typu TABLE, např. Tab_Telefony může nabývat hodnot NULL … prázdná hodnota Tab_Telefony() … prázdné pole Tab_Telefony(NULL) … jednoprvkové pole Tab_Telefony(’ ’, ’ ’) DBI026 -DB Aplikace - MFF UK 467

468 Typ TABLE v Oracle kolekce, hnízděné tabulky
Metody kolekcí Použitelné jen v PL/SQL, ne SQL společné i pro kolekce, u VARRAY jsou některé funkce zbytečné, protože pole je obsazené hustě bez mezer Exists(k) … TRUE, pokud existuje k-tý prvek pole Count … Počet existujících prvků v poli Limit … Max. možný počet prvků v poli First, Last … Indexy prvního a posledního ex. prvku Prior, Next … Indexy předchozího a následujícího prvku Extend[(n[,i])] … přidá 1 (n) prázdných prvků, resp. kopií i-tého Trim[(n)] … odebere 1 (n) prvků z konce pole Delete [(n[,m])] … smaže všechny / n-tý / n-tý..m-tý nelze použít u VARRAY, jen kolekcí DBI026 -DB Aplikace - MFF UK 468

469 Typ TABLE v Oracle kolekce, hnízděné tabulky
Deklarace hnízděné tabulky CREATE TABLE Zam( ID NUMBER(10) CONSTRAINT Zam_PK PRIMARY KEY, Jmeno VARCHAR2(50) NOT NULL, Tel Tab_Telefony) NESTED TABLE Tel STORE AS Zam_Tel; DBI026 -DB Aplikace - MFF UK 469

470 Typ TABLE v Oracle kolekce, hnízděné tabulky
Manipulace s prvky hnízděné tabulky V Oracle 8 Operátor THE V Oracle 9 Operátor TABLE, THE je zastaralý INSERT INTO TABLE( SELECT Tel FROM Zam WHERE ID=1 ) VALUES(’ ’); SELECT z.Jmeno, t.* FROM Zam z, TABLE(z.Tel) t; DBI026 -DB Aplikace - MFF UK 470

471 Nekompletní strukturované typy
Definují pouze jméno typu Nedefinují obsah ani chování Nutné při křížových odkazech mezi typy CREATE TYPE t1; CREATE TYPE t2 AS OBJECT( reft1 REF t1, … ); DBI026 -DB Aplikace - MFF UK 471

472 DBI026 -DB Aplikace - MFF UK
Typ REF v Oracle Reference mezi objekty Deklarace bez omezení oboru hodnot: REF jméno_typu CREATE TYPE T_ListItem AS OBJECT( Key VARCHAR2(20) NOT NULL, Next REF T_ListItem ); Deklarace s omezením oboru hodnot (Scoped REF): REF jméno_typu SCOPE IS jméno_objektové_tabulky CREATE TYPE T_ListItem AS OBJECT( Key VARCHAR2(20) NOT NULL, Next REF T_ListItem SCOPE IS ItemTable ); DBI026 -DB Aplikace - MFF UK 472

473 DBI026 -DB Aplikace - MFF UK
Typ REF v Oracle Dangling REF Reference odkazující na již neexistující objekt Predikát IS [NOT] DANGLING Deklarace reference v PL/SQL DECLARE refListItem REF TO T_ListItem; Získání reference pomocí operátoru REF SELECT REF(x) FROM ItemTable x; Dereference pomocí tečkové notace SELECT x.Next.Key FROM ItemTable x WHERE x.Next IS NOT NULL AND x.Next IS NOT DANGLING; DBI026 -DB Aplikace - MFF UK 473

474 DBI026 -DB Aplikace - MFF UK
Objektové pohledy Z objektové tabulky CREATE VIEW OF typ AS SELECT … Z relační tabulky CREATE VIEW OF typ WITH OBJECT IDENTIFIER (sloupec [, …]) AS SELECT typ(…) FROM …; Vytvoření reference do objektového pohledu MAKE_REF(hodnota [, …]) DBI026 -DB Aplikace - MFF UK 474

475 DBI026 -DB Aplikace - MFF UK
Objektové pohledy Hierarchie objektových pohledů CREATE SuperTyp_VW OF SuperTyp AS …; CREATE SubTyp_VW OF SubTyp UNDER SuperTyp_VW AS …; DBI026 -DB Aplikace - MFF UK 475

476 Objektové predikáty a konverze
Predikát objekt IS OF (typ) True, pokud je objekt typu typ, nebo potomek Predikát ONLY objekt IS OF (ONLY typ) True, pokud je objekt právě typu typ Operátor TREAT(objekt AS typ) Přetypuje typ na podtyp DBI026 -DB Aplikace - MFF UK 476

477 Objektové predikáty a konverze
Funkce SYS_TYPEID(objekt) Číselný interní identifikátor typu dané instance Kořenové FINAL typy (bez předků a potomků) mají SYS_TYPEID prázdný (NULL) Funkce REF(objekt) Vrací referenci na objekt Funkce DEREF(reference) Vrací objekt odkazovaný referencí DBI026 -DB Aplikace - MFF UK 477

478 Nahraditelnost předků potomky
Standardně může tabulka instancí typu typ, obsahovat potomky Lze explicitně vypnout klauzulí NOT SUBSTITUTABLE AT ALL LEVELS Vnořená tabulka CREATE TABLE departments( name VARCHAR2(10), emps emp_set ) NESTED TABLE (emps) NOT SUBSTITUTABLE AT ALL LEVELS STORE AS ...; DBI026 -DB Aplikace - MFF UK 478

479 Nahraditelnost předků potomky
Standardně může sloupec typu typ obsahovat potomky Lze explicitně vypnout klauzulí IS OF (ONLY …) Sloupec tabulky CREATE TABLE Student_books OF Book_typ COLUMN author IS OF (ONLY Student_typ); DBI026 -DB Aplikace - MFF UK 479

480 Deklarace omezení na obj. tabulkách
CREATE TYPE TOsoba AS OBJECT( rc VARCHAR2(11), jm VARCHAR2(30) ); / CREATE TABLE OOsoby OF TOsoba( rc CONSTRAINT OOsoby_PK PRIMARY KEY ); ALTER TABLE OOsoby ADD( CONSTRAINT OOsoby_PK PRIMARY KEY(rc) ); DBI026 -DB Aplikace - MFF UK 480

481 Deklarace indexů na obj. tabulkách
Pouze přes atomické položky strukturovaných objektů Nelze vytvořit index přes celou instanci objektu CREATE INDEX ON OOsoby(jm); DBI026 -DB Aplikace - MFF UK 481

482 National Language Support Oracle
NLS National Language Support Oracle 482

483 Podpora národních jazyků (National Language Support)
Zahrnuje řadu rozšíření pro provoz v národním i vícejazyčném prostředí Znakové sady Národní datové typy Použití speciálních znaků v názvech objektů Kódy měny Zobrazování čísel Kalendář, formát datumu, ... Způsob třídění a porovnávání dle pravidel jazyka Jazyk komunikace DBI026 -DB Aplikace - MFF UK 483

484 Podpora národních jazyků (National Language Support)
Národní prostředí databázového serveru Dvojí znaková sada databáze Univerzální (UTF-8, ISO Latin 2, CP 1250, …) Národní (ISO Latin 2, US ASCII 7bit) Ne „větší“ než univerzální sada Úspora místa v případě vícebajtového univerzálního kódování Dvojí znakové datové typy Dle ANSI SQL: NATIONAL <jméno typu> např. NATIONAL CHARACTER VARYING Proprietární typy N<jméno typu> např. NVARCHAR2 DBI026 -DB Aplikace - MFF UK 484

485 Podpora národních jazyků (National Language Support)
Národní prostředí klienta Proprietární řešení, používající přepínače NLS_* x Tři úrovně nastavení Pro počítač, resp. Uživatele Proměnné prostředí (UNIX) Hodnoty v registru (MS Windows) HKLM\Software\Oracle\ HKCU\Software\Oracle\ Pro session Na začátku dle nastavení 1. Změna příkazem ALTER SESSION SET přepínač=hodnota Platí do další explicitní změny či odhlášení Pro konkrétní příkaz Dodatečný (nepovinný) parametr u některých funkcí DBI026 -DB Aplikace - MFF UK 485

486 Podpora národních jazyků (National Language Support)
Přepínač NLS_LANG základní nastavení NLS prostředí ostatní jsou pouze doplňkové pro předefinování detailů Formát hodnoty NLS_LANG=Language_Territory.CodePage American_America.EE8ISO8859P2 Jazyk komunikace anglický (US) Národní prostředí pro USA Kódová stránka na klientovi ISO Latin 2 Czech_Czech Republic.EE8WIN1250 DBI026 -DB Aplikace - MFF UK 486

487 Podpora národních jazyků (National Language Support)
Přepínač NLS_LANGUAGE Předefinuje nastavení jazyka z NLS_LANG Formát hodnoty NLS_LANGUAGE=Language Czech, Slovak, German, … Ovlivňuje jazyk komunikace Chybová hlášení Názvy dní, měsíců DBI026 -DB Aplikace - MFF UK 487

488 Podpora národních jazyků (National Language Support)
Přepínač NLS_TERRITORY Předefinuje nastavení oblasti z NLS_LANG Formát hodnoty NLS_TERRITORY=Territory Czech Republic, Slovakia, Germany, … Ovlivňuje většinu nastavení národního prostředí Formáty čísel, datumů Kalendář DBI026 -DB Aplikace - MFF UK 488

489 Podpora národních jazyků Porovnávání a třídění
Přepínač NLS_SORT Předefinuje nastavení třídění, odvozené z NLS_LANGUAGE Formát hodnoty NLS_SORT=BINARY | Language Czech, Slovak, German, … Pro BINARY se třídí dle kódů znaků, tedy např. Máma > My Pro např. Czech se třídí lingvisticky, včetně H < Ch < I Obdobně se dodrží specifika i pro ostatní jazyky ALE nealfanumerické znaky se ignorují A < *B DBI026 -DB Aplikace - MFF UK 489

490

491 Podpora národních jazyků Porovnávání a třídění
Funkce NLSSORT( s VARCHAR2 [, nls_settings VARCHAR2] ) RETURN VARCHAR2 Vrací pro řetězec s jeho reprezentaci takovou, aby při jejich binárním porovnávání byly dodrženy lingvistické pravidla jazyka NLSSORT(x) <bin NLSSORT(y)  x <lang y DBI026 -DB Aplikace - MFF UK 491

492 Podpora národních jazyků Porovnávání a třídění
Lingvistické indexy Funkční indexy, využívající funkci NLSSORT CREATE INDEX nls_index ON tabulka( NLSSORT(sloupec, 'NLS_SORT = German') ); DBI026 -DB Aplikace - MFF UK 492

493 Podpora národních jazyků Porovnávání a třídění
Vícejazykové indexy Funkční indexy, využívající funkci NLSSORT CREATE INDEX german_index ON tabulka( NLSSORT(sloupec, 'NLS_SORT = German') ); CREATE INDEX czech_index ON tabulka( NLSSORT(sloupec, 'NLS_SORT = Czech') ); Správný index se vybere dle NLS_SORT v session DBI026 -DB Aplikace - MFF UK 493

494 Podpora národních jazyků Porovnávání a třídění
Lingvistické indexy fungují, pokud Povolený přepínač QUERY_REWRITE_ENABLED ALTER SESSION SET QUERY_REWRITE_ENABLED=TRUE; Přepínač NLS_COMP nastavený na ANSI ALTER SESSION SET NLS_COMP=ANSI; Optimalizace nastavena na cost-based, s cílem minimalizovat odezvu na první řádky ALTER SESSION SET OPTIMIZER_MODE = FIRST_ROWS; DBI026 -DB Aplikace - MFF UK 494

495 Podpora národních jazyků Porovnávání a třídění
ALTER SESSION SET QUERY_REWRITE_ENABLED=TRUE; ALTER SESSION SET NLS_COMP = ANSI; ALTER SESSION SET NLS_SORT='FRENCH'; ALTER SESSION SET OPTIMIZER_MODE = FIRST_ROWS; CREATE INDEX test_idx ON test(NLSSORT(col, 'NLS_SORT=FRENCH')); SELECT * FROM test ORDER BY col; SELECT * FROM test WHERE col > 'JJJ'; DBI026 -DB Aplikace - MFF UK 495

496 Podpora národních jazyků Porovnávání a třídění
Vyhledávání bez ohledu na velikost znaků Funkční indexy, využívající funkci NLSSORT CREATE INDEX nls_index ON tabulka( NLS_UPPER(sloupec, 'NLS_SORT = German') ); DBI026 -DB Aplikace - MFF UK 496

497 Podpora národních jazyků Porovnávání a třídění
Vyhledávání bez ohledu na diakritiku: háčky, čárky (přehlásky, …) ALTER SESSION SET NLS_COMP=ANSI; ALTER SESSION SET NLS_SORT=GENERIC_BASELETTER; Písmena e,é,ě,E,É,Ě budou považována při porovnávání za shodná DBI026 -DB Aplikace - MFF UK 497

498 Podpora národních jazyků Datumy
Přepínač NLS_CALENDAR Defaultně Gregorian Existují i další Arabic Hijrah English Hijrah Japanese Imperial Persian ROC Official Thai Buddha DBI026 -DB Aplikace - MFF UK 498

499 Podpora národních jazyků Datumy
Přepínač NLS_DATE_LANGUAGE Jazyk pro názvosloví dní a měsíců Default odvozen z NLS_LANGUAGE Použitelný v konverzní funkci TO_CHAR(datum, formát,’NLS_DATE_LANGUAGE=Czech’) Formátovací značky Day … den v týdnu (Pondělí, …, Neděle) Dy … den zkratkou (Po, …, Ne) Month … měsíc slovem (Leden, …, Prosinec) Mon … měsíc zkratkou (Led, …, Pro) Neovlivní spelování a skloňování DDTH … 12TH, ne 12tého DDSP … twelve, ne dvanáct DDSPTH … twelfth, ne dvanáctého DBI026 -DB Aplikace - MFF UK 499

500 Podpora národních jazyků Datumy
Přepínač NLS_DATE_FORMAT Formát datumu Default odvozen z NLS_TERRITORY DD-MON-RR pro America DD.MM.YYYY pro Czech Republic Použitý jako default v konverzní funkci TO_CHAR(datum) TO_DATE(’text’) DBI026 -DB Aplikace - MFF UK 500

501 Podpora národních jazyků Časová razítka
Datový typ TIMESTAMP Od verze 9i Obdobný typu date, přesnost na tisícinu sekundy Funkce TO_TIMESTAMP Zlomky sekund mají masku FF Přepínač NLS_TIMESTAMP_FORMAT DBI026 -DB Aplikace - MFF UK 501

502 Podpora národních jazyků Časové zóny
Datový typ TIMESTAMP WITH TIME ZONE Funkce SESSIONTIMEZONE CURRENT_DATE … datum s ohledem na časové zóny Od verze 9i Přepínač TIME_ZONE ALTER SESSION SET TIME_ZONE = '+1:0'; Přepínač NLS_TIMESTAMP_TZ_FORMAT Pro funkce TO_CHAR, TO_TIMESTAMP_TZ 'DD.MM.YYYY HH24:MI:SS.FF TZH:TZM' DBI026 -DB Aplikace - MFF UK 502

503 Podpora národních jazyků Časové zóny
ALTER SESSION SET TIME_ZONE = local; Nastavit TZ pro session dle operačního systému ALTER SESSION SET TIME_ZONE = DBTIMEZONE; Nastavit TZ pro session dle databáze ALTER SESSION SET TIME_ZONE = '+01:00'; Nastavit TZ pro session na časový posun oproti GMT ALTER SESSION SET TIME_ZONE = 'America/New_York'; DBI026 -DB Aplikace - MFF UK 503

504 Podpora národních jazyků Časové zóny
Funkce LOCALTIMESTAMP Vrací typ TIMESTAMP Funkce CURRENT_TIMESTAMP Vrací typ TIMESTAMP WITH TIME ZONE Funkce SESSIONTIMEZONE Funkce DBTIMEZONE DBI026 -DB Aplikace - MFF UK 504

505 Podpora národních jazyků Čísla a měna
Přepínač NLS_NUMERIC_CHARACTERS Znaky pro oddělovač desetin a skupin Default odvozen z NLS_TERRITORY ’.,’ pro America ’, ’ pro Czech Republic Použitý v konverzní funkci TO_CHAR(číslo, formát) DBI026 -DB Aplikace - MFF UK 505

506 Podpora národních jazyků Čísla a měna
Přepínač NLS_NUMERIC_CHARACTERS Znaky pro oddělovač desetin a skupin Default odvozen z NLS_TERRITORY ’.,’ pro America ’, ’ pro Czech Republic Použitý v konverzní funkci TO_CHAR(číslo, formát) DBI026 -DB Aplikace - MFF UK 506

507 Podpora národních jazyků Čísla a měna
Konverzní funkce TO_CHAR(číslo, formát) 9 cifra, resp. mezera, pokud číslo nemá dost cifer 0 cifra, resp. nula, pokud číslo nemá dost cifer D oddělovač desetin G oddělovač skupin Příklad: ’999G999G990D00’ DBI026 -DB Aplikace - MFF UK 507

508 Podpora národních jazyků Čísla a měna
Přepínač NLS_CURRENCY Symbol měny, odvozený z NLS_TERRITORY Defaultně Kč pro Czech Republic Formátovací znak po TO_CHAR(n) … L Přepínač NLS_ISO_CURRENCY ISO symbol měny, odvozený z NLS_TERRITORY Defaultně CZK pro Czech Republic Formátovací znak po TO_CHAR(n) … C DBI026 -DB Aplikace - MFF UK 508

509 Podpora národních jazyků Čísla a měna
Konverzní funkce TO_CHAR(číslo, formát) I kód měny dle ISO C kód měny Příklad: ’999G990D00 I’ DBI026 -DB Aplikace - MFF UK 509

510 Podpora národních jazyků Funkce
UPPER, LOWER, INITCAP Řídí se nastavením NLS_LANGUAGE NLS_UPPER, NLS_LOWER, NLS_INITCAP Mají nepovinný druhý parametr s NLS přepínači DBI026 -DB Aplikace - MFF UK 510

511 DBI026 -DB Aplikace - MFF UK
MFF - Výhled mates.ms.mff… Linux Server mates.ms.mff.cuni.cz Databáze devitka (9.2.0) Databáze desitka (10.x) Klienti Linux (9.2.0, 10.x) Laboratoř UW1, UW2 Klienti Win32 (9.2.0, 10.x) Laboratoř US1, US2 (u-pl*.ms.mff…) Klienti Linux (10.x) devitka desitka TCP/IP UW1,2 u-pl*.ms.mff… DBI026 -DB Aplikace - MFF UK 511


Stáhnout ppt "Databázové Aplikace Slidy k přednášce NDBI026 KSI MFF UK"

Podobné prezentace


Reklamy Google