Normální formy, referenční integrita, návrh databáze, interakce s ostatními jazyky



Podobné dokumenty
Databázové systémy. Úvod do teorie normalizace. Vilém Vychodil

Databázové systémy. - SQL * definice dat * aktualizace * pohledy. Tomáš Skopal

Databázové systémy. Integritní omezení. Vilém Vychodil. V. Vychodil (KMI/DATA1, Přednáška 9) Integritní omezení Databázové systémy 1 / 33

Databáze I. Přednáška 4

Návrh a tvorba WWW stránek 1/14. PHP a databáze

Databázové systémy II. KIV/DB2 LS 2007/2008. Zadání semestrální práce

Databázové systémy Cvičení 5.2

Kapitola 6: Omezení integrity. Omezení domény

Úvod do databázových systémů

Primární klíč (Primary Key - PK) Je právě jedna množina atributů patřící jednomu z kandidátů primárního klíče.

Databáze II. 1. přednáška. Helena Palovská

7. Integrita a bezpečnost dat v DBS

7. Integrita a bezpečnost dat v DBS

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.

Databáze 2011/2012 SQL DDL (CREATE/ALTER/DROP TABLE), DML (INSERT/UPDATE/DELETE) RNDr.David Hoksza, Ph.D.

Západočeská univerzita v Plzni Katedra informatiky a výpočetní techniky. 9. června krovacek@students.zcu.cz

RELAČNÍ DATABÁZOVÉ SYSTÉMY

Stored Procedures & Database Triggers, Tiskové sestavy v Oracle Reports

Semestrální práce z DAS2 a WWW

Databáze. Logický model DB. David Hoksza

Gymnázium a Střední odborná škola, Rokycany, Mládežníků 1115

Databázové systémy trocha teorie

2. blok část B Základní syntaxe příkazů SELECT, INSERT, UPDATE, DELETE

8.2 Používání a tvorba databází

Informační systémy 2008/2009. Radim Farana. Obsah. Jazyk SQL

Použití databází na Webu

Kapitola 7: Návrh relačních databází. Nástrahy relačního návrhu. Příklad. Rozklad (dekompozice)

Konceptuální modelování a SQL

5. Formalizace návrhu databáze

Jaký je rozdíl v definicicíh VARCHAR2(20 BYTE) a VARCHAR2(20 CHAR):

Databázové systémy úvod

Relace x vztah (relationship)

Semináˇr Java X JDBC Semináˇr Java X p.1/25

PL/SQL. Jazyk SQL je jazykem deklarativním, který neobsahuje procedurální příkazy jako jsou cykly, podmínky, procedury, funkce, atd.

A5M33IZS Informační a znalostní systémy. Relační databázová technologie

4. lekce Přístup k databázi z vyššího programovacího jazyka

Transformace konceptuálního modelu na relační

InnoDB transakce, cizí klíče, neumí fulltext (a nebo už ano?) CSV v textovém souboru ve formátu hodnot oddělených čárkou

Databáze 2013/2014. Konceptuální model DB. RNDr. David Hoksza, Ph.D.

Marketingová komunikace. 2. soustředění. Mgr. Pavel Vávra Kombinované studium Skupina N9KMK1aPH/N9KMK1bPH (um1a1ph/um1b1ph)

Vkládání, aktualizace, mazání

FIREBIRD relační databázový systém. Tomáš Svoboda

5. POČÍTAČOVÉ CVIČENÍ

Obchodní akademie a Jazyková škola s právem státní jazykové zkoušky Jihlava

Text úlohy. Systémový katalog (DICTIONARY):

Databáze I. Přednáška 7

5. Formalizace návrhu databáze

Fakulta elektrotechniky a informatiky Databázové systémy 2. Leden 2010 souhrn. Červené dobře (nejspíš), modré možná

Oracle XML DB. Tomáš Nykodým

6. SQL složitější dotazy, QBE

Dotazování v relačním modelu a SQL

Sada 1 - PHP. 14. Úvod do jazyka SQL

SQL - trigger, Databázové modelování

Administrace Oracle Práva a role, audit. Kukhar Maria

Marketingová komunikace. 2. a 3. soustředění. Mgr. Pavel Vávra 9103@mail.vsfs.cz. Kombinované studium Skupina N9KMK3PH (vm3aph)

Verzování a publikace dat na webu za pomoci PostgreSQL

Platforma Java. Petr Krajča. Katedra informatiky Univerzita Palackého v Olomouci. Petr Krajča (UP) KMI/PJA: Seminář V. 27. říjen, / 15

Třídy a objekty. Třídy a objekty. Vytvoření instance třídy. Přístup k atributům a metodám objektu. $z = new Zlomek(3, 5);

O Apache Derby detailněji. Hynek Mlnařík

Úvod do databázových systémů

SQL v14. 4D Developer konference. 4D Developer conference 2015 Prague, CZ Celebrating 30 years

Michal Krátký, Miroslav Beneš

Jazyk SQL databáze SQLite. připravil ing. petr polách

Analýza a modelování dat 3. přednáška. Helena Palovská

Obsah přednášky. Představení webu ASP.NET frameworky Relační databáze Objektově-relační mapování Entity framework

Databázové systémy I

Relační databázový model. Vladimíra Zádová, KIN, EF, TUL- DBS

Jazyk SQL 3 - DML, DDL, TCL, DCL

Tabulka fotbalové ligy

Relační datový model. Integritní omezení. Normální formy Návrh IS. funkční závislosti multizávislosti inkluzní závislosti

SQL injection princip a ochrana

Databázové systémy. Cvičení 3

A5M33IZS Informační a znalostní systémy. O čem předmět bude? Úvod do problematiky databázových systémů

Inovace a zkvalitnění výuky prostřednictvím ICT. Základní seznámení s MySQL Ing. Kotásek Jaroslav

Databázové systémy. Datová integrita + základy relační algebry. 4.přednáška

Databáze I. 5. přednáška. Helena Palovská

Obsah přednášky. Databázové systémy. Normalizace relací. Normalizace relací. Normalizace relací. Normalizace relací

Databázové systémy. Tomáš Skopal. - úvod do relačního modelu. - převod konceptuálního schématu do relačního

Stručný obsah. část III Aktualizace dat Kapitola 10: Aktualizace databáze 257 Kapitola 11: Integrita dat 275 Kapitola 12: Zpracování transakcí 307

DATABÁZE A INFORMAČNÍ SYSTÉMY

Kapitola 1: Úvod. Systém pro správu databáze (Database Management Systém DBMS) Účel databázových systémů

Obsah přednášky. Databázové systémy RDBMS. Fáze návrhu RDBMS. Coddových 12 pravidel. Coddových 12 pravidel

Administrace Oracle. Práva a role, audit

PRŮBĚHOVÝ TEST Z PŘEDNÁŠEK

Inovace tohoto kurzu byla spolufinancována z Evropského sociálního fondu a státního rozpočtu České republiky.

DBS Transformace konceptuálního schématu na

Práva a role. Martin Polák. NDBI013 Administrace Oracle

Virtual private database. Antonín Steinhauser

Základy informatiky. 06 Databázové systémy. Kačmařík/Szturcová/Děrgel/Rapant

DUM 15 téma: Příkazy pro řízení přístupu

UNIVERZITA PALACKÉHO V OLOMOUCI

4IT218 Databáze. 4IT218 Databáze

Střední odborná škola a Střední odborné učiliště, Hořovice

Kurz Databáze. Obsah. Dotazy. Zpracování dat. Doc. Ing. Radim Farana, CSc.

Optimalizace dotazů a databázové transakce v Oracle

Úvod do databázových systémů 10. cvičení

Jazyk C# - přístup k datům

Databázové modelování. Analýza Návrh konceptuálního schématu

- sloupcové integritní omezení

Databáze I. Přednáška 3

Transkript:

Databázové systémy Normální formy, referenční integrita, návrh databáze, interakce s ostatními jazyky Petr Krajča Katedra informatiky Univerzita Palackého v Olomouci Petr Krajča (UP) KMI/YDATA: Přednáška V. 12. prosinec, 2014 1 / 33

Motivace pro normalizaci SCHOOL DEAN DEPT HEAD ID COURSE YEAR SCI Adams AF Black 7 QOPT1 2012 SCI Adams AF Black 8 LASR1 2012 SCI Adams AF Black 8 LASR1 2013 SCI Adams CS Davis 3 ALMA1 2012 SCI Adams CS Davis 3 ALMA1 2013 SCI Adams CS Davis 6 DATA1 2012 SCI Adams CS Davis 6 DATA1 2013 SCI Adams CS Davis 6 PAPR1 2012 Problémy redundance dat (zbytečná duplikace hodnot) anomálie spojená s výmazem dat (výmaz kurzů katedry,,odstraní vedoucího ) anomálie spojená s aktualizací hodnot (změna vedoucího katedry na víc místech) Petr Krajča (UP) KMI/YDATA: Přednáška V. 12. prosinec, 2014 2 / 33

Opakování: 1. NF A table is in first normal form (1NF) equivalently, such a table is normalized if and only if it s a direct and faithful representation of some relation. C.J.Date První normální forma (1NF) Tabulka je v první normální formě, pokud splňuje všechny následující podmínky: 1 neuvažuje se žádné uspořádání řádků (shora-dolů) 2 neuvažuje se žádné uspořádání sloupců (zleva-doprava) 3 v tabulce se nevyskytují duplicitní řádky 4 v každém vnitřní poli tabulky je právě jedna hodnota daného typu 5 všechny atributy jsou regulární (neobsahují žádnou skrytou informaci, která je dostupná pouze prostřednictvím speciálních funkcí) Petr Krajča (UP) KMI/YDATA: Přednáška V. 12. prosinec, 2014 3 / 33

2. NF Mějme relační schéma R, teorii Γ a množinu kĺıčů K 1,..., K n R vzhledem k Γ. Pak relačním schéma R je ve druhé normální formě (2.NF) vzhledem k Γ, jestliže 1 je v 1. NF, 2 pokud pro každý atribut y R takový, že y K i pro všechna i = 1,..., n, platí pro všechny K K i, kde i = 1,..., n. Poznámka Γ = K {y}, Jinými slovy: Žádný atribut, který není součástí kĺıče, není závislý na části některého kĺıče. Jinak: Každý atribut, který není součástí kĺıče, je závislý na všech kĺıčích. Petr Krajča (UP) KMI/YDATA: Přednáška V. 12. prosinec, 2014 4 / 33

Příklad INVOICE DATE ITEM PRICE 2014001 2014-01-30 Apples 123 2014001 2014-01-30 Bananas 100 2014001 2014-01-30 Coconut 345 2014002 2014-02-20 Apples 300 2014002 2014-02-20 Bananas 500 Funkční závislosti {INVOICE} {DATE} {INVOICE, ITEM} {PRICE} INVOICE DATE 2014001 2014-01-30 2014002 2014-02-20 INVOICE ITEM PRICE 2014001 Apples 123 2014001 Bananas 100 2014001 Coconut 345 2014002 Apples 300 2014002 Bananas 500 Petr Krajča (UP) KMI/YDATA: Přednáška V. 12. prosinec, 2014 5 / 33

3. NF Mějme relační schéma R a teorii Γ. Pak R je ve třetí normální formě vzhledem k Γ, pokud R je v 2.NF vzhledem k Γ a žádný nekĺıčový atribut y R není tranzitivně závislý na nějakém nadkĺıči relačního schématu R. Funkční závislost A C v teorii Γ je tranzitivní, pokud existuje B takové, že Γ = A B a Γ = B C, přičemž Γ = B A. Jinými slovy: Atribut C je tranzitivně závislý na A, pokud existuje B takové, že A B a B C. Poznámky: Nekĺıčové atributy závisí pouze na kĺıči. Možná interpretace: Každý nekĺıčový atribut musí reprezentovat pouze fakt o kĺıčí, celém kĺıči a ničem jiném. Petr Krajča (UP) KMI/YDATA: Přednáška V. 12. prosinec, 2014 6 / 33

Příklad ITEM DEPT ID DEPT NAME PRICE 1 1 books 123 2 2 clothes 100 3 1 books 345 4 1 books 300 5 2 clothes 500 Funkční závislosti {ITEM} {DEPT ID} {DEPT ID} {DEPT NAME} tranzitivní závislost {ITEM} {DEPT ID} {DEPT NAME} ITEM DEPT ID PRICE 1 1 123 2 2 100 3 1 345 4 1 300 5 2 500 DEPT ID DEPT NAME 1 books 2 clothes Petr Krajča (UP) KMI/YDATA: Přednáška V. 12. prosinec, 2014 7 / 33

Anomálie v 3NF Uvažujme relační schéma {ID DODAVATELE, NAZEV DODAVATELE, PSC, MESTO} s funkčními závislostmi: {ID DODAVATELE} {NAZEV DODAVATELE}, {ID DODAVATELE} {MESTO}, {ID DODAVATELE} {PSC}, {NAZEV DODAVATELE} {ID DODAVATELE}, {NAZEV DODAVATELE} {MESTO}, {NAZEV DODAVATELE} {PSC}, kandidátními kĺıči jsou {ID DODAVATELE}, {NAZEV DODAVATELE} problém: odstraněním řádků s konkrétním dodavatelem ztratíme informaci o jeho ID a městě možná dekompozice {ID DODAVATELE, NAZEV DODAVATELE} a {ID DODAVATELE, PSC, MESTO} Petr Krajča (UP) KMI/YDATA: Přednáška V. 12. prosinec, 2014 8 / 33

Boyce-Coddova normální forma (BCNF) Mějme relační schéma R a teorii Γ. Pak R je v BCNF vzhledem k Γ, pokud pro každou netriviální A B Γ platí, že Γ = A R. Poznámka: Možná interpretace: Atribut musí reprezentovat pouze fakt o kĺıčí, celém kĺıči, a ničem jiném. Normalizace pomocí dekompozice Pokud není R v BCNF vzhledem k Γ, pak 1 vezmeme netriviální A B Γ takovou, že Γ = A R 2 položíme R 1 = A B a Γ 1 = {C R 1 D R 1 C R 1 D Γ} 3 položíme R 2 = A (R\B) a Γ 2 = {C R 2 D R 2 C R 2 D Γ} 4 proces se pokusíme opakovat pro R 1 a Γ 1, pokud není v BCNF a analogicky pro R 2 a Γ 2 Poznámka: každé schéma ve 3NF je zároveň v BCNF; obrácené tvrzení neplatí BCNF nemusí být dosažitelná Petr Krajča (UP) KMI/YDATA: Přednáška V. 12. prosinec, 2014 9 / 33

Příklad: Schéma, které není v BCNF Uvažujme relační schéma: R = {SCHOOL, DEAN, DEPT, HEAD, ID, COURSE, YEAR} a teorii Γ popisující závislosti mezi atributy: Γ = {{DEPT} {HEAD, SCHOOL, DEAN}, {SCHOOL} {DEAN}, {COURSE, YEAR} {ID}, {ID, YEAR} {DEPT}}. Schéma R není v BCNF vzhledem k Γ, protože (například): {DEPT} {HEAD, SCHOOL, DEAN} Γ, ale [{DEPT}] Γ = {SCHOOL, DEAN, DEPT, HEAD} R, to jest Γ = {DEPT} R, nebo: {SCHOOL} {DEAN} Γ, ale [{SCHOOL}] Γ = {SCHOOL, DEAN} R, to jest Γ = {SCHOOL} R. Petr Krajča (UP) KMI/YDATA: Přednáška V. 12. prosinec, 2014 10 / 33

Příklad: Normalizace pomocí dekompozice R = {SCHOOL, DEAN, DEPT, HEAD, ID, COURSE, YEAR} Γ = {{DEPT} {HEAD, SCHOOL, DEAN},...} (viz předchozí příklad) R 1 = {SCHOOL, DEAN, DEPT, HEAD} Γ 1 = {{DEPT} {HEAD, SCHOOL, DEAN}, {SCHOOL} {DEAN}} R 11 = {SCHOOL, DEAN} Γ 11 = {{SCHOOL} {DEAN}} R 12 = {SCHOOL, DEPT, HEAD} Γ 12 = {{DEPT} {HEAD, SCHOOL}, {SCHOOL} {}} R 2 = {DEPT, ID, COURSE, YEAR} Γ 2 = {{DEPT} {}, {COURSE, YEAR} {ID}, {ID, YEAR} {DEPT}} R 21 = {DEPT, ID, YEAR} Γ 21 = {{DEPT} {}, {ID, YEAR} {DEPT}} R 22 = {ID, COURSE, YEAR} Γ 22 = {{COURSE, YEAR} {ID}, {ID, YEAR} {}} Petr Krajča (UP) KMI/YDATA: Přednáška V. 12. prosinec, 2014 11 / 33

Rozklad SCHOOL DEAN DEPT HEAD ID COURSE YEAR SCI Adams AF Black 7 QOPT1 2012 SCI Adams AF Black 8 LASR1 2012 SCI Adams AF Black 8 LASR1 2013 SCI Adams CS Davis 3 ALMA1 2012 SCI Adams CS Davis 3 ALMA1 2013 SCI Adams CS Davis 6 DATA1 2012 SCI Adams CS Davis 6 DATA1 2013 SCI Adams CS Davis 6 PAPR1 2012 SCHOOL DEPT HEAD SCI AF Black SCI CS Davis DEPT ID YEAR AF 7 2012 AF 8 2012 AF 8 2013 CS 3 2012 CS 3 2013 CS 6 2012 CS 6 2013 = SCHOOL DEAN SCI Adams ID COURSE YEAR 7 QOPT1 2012 8 LASR1 2012 8 LASR1 2013 3 ALMA1 2012 3 ALMA1 2013 6 DATA1 2012 6 DATA1 2013 6 PAPR1 2012 Petr Krajča (UP) KMI/YDATA: Přednáška V. 12. prosinec, 2014 12 / 33

Referenční integritní omezení Hodnoty atributů jedné relace se musí nacházet jako hodnoty (jiných) atributů jiné relace. Mějme relační proměnné R typu R a S typu S. Referenční integritní omezení je výraz ve tvaru ρ f (π R (R)) π S (S), kde R R a S S. Omezení ρ f (π R (R)) π S (S) je splněno v D, pokud pro každou r R D platí, že existuje s S D tak, že r(f(y)) = s(y) pro každý atribut y S. Příklady S studenti, P předměty, Z student má zapsaný předmět ρ ID STUDENT ID (π STUDENT ID (Z)) π ID (S) ρ ID COURSE ID (π COURSE ID (Z)) π ID (P) Petr Krajča (UP) KMI/YDATA: Přednáška V. 12. prosinec, 2014 13 / 33

Referenční integritní omezení v SQL SQL (částečně) implementuje pomocí cizích kĺıčů pro ρ f (π R (R)) π S (S) je R je cizí kĺıč relační proměnné R, který se odkazuje na atributy S proměnné S nutný předpoklad: S musí být kĺıč v S (PRIMARY KEY nebo UNIQUE) SQL: jednoatributový cizí kĺıč (sloupcové omezení): REFERENCES jméno-tabulky ( atribut ) víceatributový cizí kĺıč (omezení v rámci celé tabulky): FOREIGN KEY (r-atribut1, r-atribut2,...) REFERENCES jméno-tabulky (s-atribut1, s-atribut2,...) Petr Krajča (UP) KMI/YDATA: Přednáška V. 12. prosinec, 2014 14 / 33

Příklad CREATE TABLE student ( id NUMERIC NOT NULL PRIMARY KEY, name VARCHAR NOT NULL, major VARCHAR NOT NULL); CREATE TABLE course ( name VARCHAR NOT NULL, ver NUMERIC NOT NULL, PRIMARY KEY (name, ver)); CREATE TABLE enrolled ( student_id NUMERIC NOT NULL REFERENCES student (id), c_name VARCHAR NOT NULL, c_ver NUMERIC NOT NULL, FOREIGN KEY (c_name, c_ver) REFERENCES course (name, ver), year NUMERIC NOT NULL, PRIMARY KEY (student_id, c_name, c_ver, year)); Petr Krajča (UP) KMI/YDATA: Přednáška V. 12. prosinec, 2014 15 / 33

Chování cizích kĺıčů v SQL Předpoklad je dáno ρ y x (π {x} (R)) π {y} (S) modifikace proměnné R, které končí chybou: vložení hodnoty x do R, která se nenachází mezi hodnotami y z S příklad: vložení výsledku zkoušky pro ID, které nepatří žádnému studentovi jako v předchozím případě, pro UPDATE příklad: snaha modifikovat ID na hodnotu, která nepatří žádnému studentovi modifikace proměnné S, kdy je možné specifikovat chování pokus smazat z S n-tici s, kde s(y) se stále používá v R příklad: smazání studenta, který má stále záznamy o zkoušce jako v předchozím případě, pro UPDATE místo DELETE příklad: modifikace ID studenta, který má záznamy o zkoušce Petr Krajča (UP) KMI/YDATA: Přednáška V. 12. prosinec, 2014 16 / 33

Možné reakce na porušení referenční integrity (1/2) NO ACTION implicitní chování okamžité zastavení, nahlášení chyby RESTRICT: nahlášení chyby bez možnosti odložení kontroly (do konce transakce) CASCADE: kaskádování nedojde k chybě, ale změna se propaguje do tabulek, ve kterých je hodnota přítomna jako cizí kĺıč: při DELETE se smažou odpovídající n-tice při UPDATE se adekvátně změní hodnoty SET NULL: smazání hodnoty z n-tic hodnoty v tabulkách s cizím kĺıčem budou nedefinované (nebezpečné) SET DEFAULT: nastavení na implicitní hodnotu pokud má atribut dánu implicitní hodnotu pomocí DEFAULT Petr Krajča (UP) KMI/YDATA: Přednáška V. 12. prosinec, 2014 17 / 33

Možné reakce na porušení referenční integrity (2/2) CREATE TABLE enrolled ( student_id NUMERIC NOT NULL REFERENCES student (id) ON UPDATE CASCADE ON DELETE CASCADE, course_id NUMERIC NOT NULL REFERENCES course (id) ON DELETE RESTRICT ON UPDATE CASCADE, year NUMERIC NOT NULL, PRIMARY KEY (student_id, course_id, year)); /* odstrani i radky z tabulky enrolled, kde je student_id = 666 */ DELETE FROM student WHERE id = 666; /* aktualizuje i radky v tabulce enrolled se student_id = 666 */ UPDATE student SET id = 777 WHERE id = 666; DROP TABLE student; -- chyba DROP TABLE student RESTRICT; -- chyba DROP TABLE student CASCADE; -- odstrani omezeni, ne tabulky Petr Krajča (UP) KMI/YDATA: Přednáška V. 12. prosinec, 2014 18 / 33

Konceptuální modelování, ER model entita odpovídá objektům reálného světa (osoba, věc) silný entitní typ existuje nezávisle na jiném entitním typu slabý entitní typ existence závisí na jiné entitním typu vlastnost popisuje entity (jméno, barva,... ) vztah (relace, relationship) vazba mezi dvěma a více entitami (pracovník-pracoviště) kardinality 1:1, 1:N, M:N Vztah k relačnímu modelu entity odpovídají relacím i vztahy odpovídají relacím (cizí kĺıče) vlastnosti nemusí odpovídat atributům Poznámka při návrhu DB možné využít ER model společně s ER diagramem (viz skripta) možné použít i UML Petr Krajča (UP) KMI/YDATA: Přednáška V. 12. prosinec, 2014 19 / 33

Přirozené, umělé a náhradní kĺıče (1/2) Přirozený kĺıč podmnožina atributů výhody: již existují v databázi možné ověřit vůči reálné entitě nevýhody: může se ukázat, že zvolený kĺıč není jednoznačný (např. 2 lidé a jedno RČ) může dojít ke změně (např. jména) nutná propagace změn do cizích kĺıčů mohou být rozsáhlé dopad na výkon, psaní složitých dotazů Umělý kĺıč přidaný atribut, který není přímo vlasností entity uživatel k němu má přístup je sám o sobě ověřitelný, přidělen externě (např. ISBN, EAN) výhody: efektivnější operace než s přírozeným kĺıčem neměnné nevýhody vyžaduje způsob, jak unikátně přiřadit hodnotu Petr Krajča (UP) KMI/YDATA: Přednáška V. 12. prosinec, 2014 20 / 33

Přirozené, umělé a náhradní kĺıče (2/2) Náhradní kĺıč systémem generovaný kĺıč (často posloupnost přirozených čísel) uživatel by jej nikdy neměl vidět (interní součást systému) výhody: efektivní provádění dotazů; úspora místa umožňuje pružněji reagovat na nečekané situace (např. dva lidé stejné RČ) neměnné nevýhody: možnost zavléct duplicity do přirozených kĺıčů problém, pokud je potřeba exportovat/sdílet data nezapadá úplně do relačního modelu Náhradní kĺıč v SQL CREATE TABLE foo (bar INTEGER AUTO_INCREMENT, -- MySQL baz SERIAL, -- PostgresSQL qux int IDENTITY(1,1)); -- MSSQL Petr Krajča (UP) KMI/YDATA: Přednáška V. 12. prosinec, 2014 21 / 33

Procedurální programování na straně databáze SQL deklarativní jazyk složité vyjádřit některé operace možnost vytvářet vlastní procedury a funkce forma abstrakce a optimalizace (data zůstávají v DBMS) CREATE PROCEDURE... CREATE FUNCTION... vlastnosti jazyků pro procedurální programování se liší mezi DBMS (Oracle PL/SQL, PostgresSQL PL/pgSQL, MSSQL T-SQL, MySQL SQL) kód je často nepřenositelný mezi DBMS Triggery procedury provedené při aktualizaci tabulky (INSERT, UDPATE, DELETE) bud na úrovni jednotlivých řádků nebo celé tabulky možnost číst obsah měněných řádků možnost nastavit provedení před nebo po změně Petr Krajča (UP) KMI/YDATA: Přednáška V. 12. prosinec, 2014 22 / 33

Prostředky pro správu databáze (1/3) každý DBMS řeší jinak vždy použijte dokumentaci Aktualizace tabulek ALTER TABLE foo ADD column_bar int; ALTER TABLE foo REMOVE column_bar; ALTER TABLE foo ADD CONSTRAINT bar_constraint CHECK (bar > 0);... DROP TABLE foo; DROP VIEW bar; Petr Krajča (UP) KMI/YDATA: Přednáška V. 12. prosinec, 2014 23 / 33

Prostředky pro správu databáze (2/3) Správa oprávnění uživatelé, role (skupiny) db. objekty jsou vlastněny uživateli/rolemi a mohou k nim mít oprávnění MySQL CREATE USER joe @ localhost IDENTIFIED BY nbusr123 ; -- prideli vsechna opravneni ke vsem tabulkam v mojedb GRANT ALL PRIVILEGES ON mojedb.* TO joe @ localhost ; -- prideli opravneni provest SELECT nad tabulkou foo GRANT SELECT PRIVILEGES ON mojedb.foo TO joe @ localhost ; -- odebere opravneni mazat zaznamy v tabulce foo REVOKE DELETE PRIVILEGES ON mojedb.foo FROM joe @ localhost ; PostgresSQL CREATE USER joe PASSWORD nbusr123 ; GRANT ALL PRIVILEGES ON DATABASE mojedb TO joe; GRANT SELECT PRIVILEGES ON foo TO joe; REVOKE DELETE PRIVILEGES ON foo FROM joe; Petr Krajča (UP) KMI/YDATA: Přednáška V. 12. prosinec, 2014 24 / 33

Prostředky pro správu databáze (3/3) Aktualizace statistik DBMS si udržuje statistiky o datech (velikost, nejčastější hodnoty) a podle nich vytváří prováděcí plán měly by se udržovat průběžně (nemusí vždy odpovídat realitě) vynucená aktualizace: MySQL: ANALYZE TABLE foo; PostgresSQL: ANALYZE foo; Uvolnění místa DBMS obvykle data nemaže přímo (pomalá operace), pouze přidá příznak, že daný řádek je odstraněný k uvolnění místa by mělo docházet průběžně po dávkach (podle nastavení) vynucené uvolnění místa: MySQL: OPTIMIZE TABLE foo; PostgresSQL: VACUUM foo; Petr Krajča (UP) KMI/YDATA: Přednáška V. 12. prosinec, 2014 25 / 33

Spolupráce SQL s jinými jazyky Embedded databáze knihovna, součást procesu přímý přístup, volání funkcí často jednouživatelské např. SQLite, Apache Derby, FireBird, SQL Server Compact,... Architektura Client/Server DBMS samostatný proces komunikace typicky přes TCP/IP (přip. unixové sockety, jiná API) víceuživatelský přístup možnost škálování na straně klienta je vyžadován ovladač pro přístup k DB Obecný přístup programovací jazyky poskytují standardní prostředky pro přístup k DBMS mohou poskytovat přístup k embedded i vzdáleným DBMS např. Java JDBC, C# ADO.NET, PHP PDO, vlastní API Petr Krajča (UP) KMI/YDATA: Přednáška V. 12. prosinec, 2014 26 / 33

Spolupráce SQL s Java (JDBC) (1/3) JDBC standardní rozhraní v Javě obvykle je potřeba přibalit k projektu JDBC ovladač (soubor *.jar dodávaný výrobcem DBMS) URL pro připojení k db: jdbc:<ovladac>://<nazev-stroje>:<port>/?<dodatecne-parametery> příklady: jdbc:postgresql://localhost/mojedb jdbc:mysql://example.com:3306/foobase připojení: String connectionurl = "jdbc:postgresql://localhost/mojedb"; Connection con = DriverManager.getConnection(connectionURL, "joe", "nbusr123"); Petr Krajča (UP) KMI/YDATA: Přednáška V. 12. prosinec, 2014 27 / 33

Spolupráce SQL s Java (JDBC) (2/3) // vytvori db prikaz try (Statement stmt = con.createstatement()) { // provede s timto prikazem dotaz stmt.executequery("select * FROM employees"); try (ResultSet results = stmt.getresultset()) { // iteruje pres vsechny radky vysledku while (results.next()) { // vybere hodnotu v prvnim a druhem sloupci // (sloupce jsou indexovany od 1!) System.out.println(results.getString(1)); System.out.println(results.getInt(2)); } } } // vybere hodnotu podle nazvu sloupce System.out.println(results.getDouble("salary")); Petr Krajča (UP) KMI/YDATA: Přednáška V. 12. prosinec, 2014 28 / 33

Spolupráce SQL s Java (JDBC) (3/3) Aktualizace stmt.executeupdate("update employee SET salary = salary * 1.1"); Připravené dotazy optimalizace zpracování dotazu předávání parametrů PreparedStatement empstmt = con.preparestatement("select * FROM employees WHERE name =?"); PreparedStatement insertstmt = con.preparestatement("insert INT employees (name, age, salary)" + "VALUES (?,?,?)"); empstmt.setstring(1, "Alice"); empstmt.executequery(); insertstmt.setstring(1, "Xavier"); insertstmt.setint(2, 40); insertstmt.setdouble(3, 24000.0); insertstmt.executeupdate(); Petr Krajča (UP) KMI/YDATA: Přednáška V. 12. prosinec, 2014 29 / 33

Spolupráce SQL s C# (ADO.NET) string constr = "Server=localhost;Database=mojedb;User Id=joe; Password=nbusr123"; using (SqlConnection con = new SqlConnection(conStr)) { string querystring = "SELECT * FROM employee WHERE name = @name"; SqlCommand command = new SqlCommand(queryString, con); command.parameters.addwithvalue("@name", "Bob"); } try { connection.open(); SqlDataReader reader = command.executereader(); while (reader.read()) { Console.WriteLine("\t{0}\t{1}\t{2}", reader[0], reader[1], reader["salary"]); } reader.close(); } catch (Exception ex) { Console.WriteLine(ex.Message); } Petr Krajča (UP) KMI/YDATA: Přednáška V. 12. prosinec, 2014 30 / 33

Spolupráce SQL s PHP (přímý přístup) PHP obsahuje API pro přímé připojení k nejběžnějším databázím (MySQL, PostgreSQL,... ) možné využít všech vlasností DBMS API jsou si podobná ale nekompatibilní nepřenositelné řešení! <? $con = pg_pconnect("host=localhost dbname=mojedb user=joe password=nbusr123"); if (!$con) die("db error"); $result = pg_query("select name, salary FROM employees"); if (!$result) die("query error"); while ($row = pg_fetch_row($result)) { echo "Name: {$row[0]}, Salary: {$row[1]}\n"; }?> Petr Krajča (UP) KMI/YDATA: Přednáška V. 12. prosinec, 2014 31 / 33

Spolupráce SQL s PHP (PDO) univerzální rozhraní pro různé DB <? $db = new PDO( postgresql:host=localhost;dbname=mojedb, joe, nbusr123 ); $result = $db->query( SELECT * FROM employees ); while($row = $result->fetch(pdo::fetch_assoc)) { echo "Name: {$row[ name ]}, Salary: {$row[ salary ]}\n"; } // pripravene dotazy $stmt = $db->prepare( SELECT * FROM employees WHERE name = :name ); $params = array( :name => Alice ); $result = $stmt->execute($params); $row = $result->fetch(pdo:fetch_assoc);?> Petr Krajča (UP) KMI/YDATA: Přednáška V. 12. prosinec, 2014 32 / 33

SQL injection attack <? $login = $_REQUEST["login"]; $pasw = sha1($_request["passwd"]); $q = "SELECT * FROM users WHERE (user = $login AND pasw = $pasw )"; $loggedin = pg_num_rows(pg_query($q));?> pokud je login foo a heslo bar funguje dobře pokud je login foo or true) -- a heslo bar máme problém protože: SELECT * FROM users WHERE (user = foo or true) -- pass=... ) přes funkce DB se lze dostat k dalším citlivým informacím řešení pokud to API umožňuje parametrizované dotazy (JDBC, ADO, PDO) nebo důsledná kontrola vstupů podobný problém nastane kdekoliv, kde použijeme eval Petr Krajča (UP) KMI/YDATA: Přednáška V. 12. prosinec, 2014 33 / 33