Adatbázis rendszerek II. I. előadás - SQL API felületek Előadó: Barabás Péter Dátum: 2008. 09.11
Követelmények Tárgy lezárása: Aláírás + kollokvium Aláírás feltétele: Gyakorlatok 67%-os teljesítése Zárthelyi: nincs Egyéni feladatok: 6 önálló feladat (gyakorlaton is!) Vizsga: Írásbeli + szóbeli (heti 1 vizsgalehetőség) SQL API felületek 2
Adatkezelés, ismétlés Megbízható, konzisztens adattárolás DBMS DB Adatbázis rendszerek I. SQLPlus, isqlplus SQL Rugalmas, igény szerinti információkinyerés Relációs DBMS Oracle DB SQL API felületek 3
Miről lesz szó? Adatkezelés, SQL felületek Alkalmazói programok Kliens-szerver struktúratípusok Kliens-szerver generációk Hálózati komponensek Programfejlesztő környezetek API felületek SQL API logikai struktúrája CURSOR mechanizmus SQL API absztrakt adatkezelő parancsok SQL API felületek 4
SQL felületek Hatékony: SQL parancsok kiadására Eredmények megtekintésére Nehézkes: Nagyobb volumenű, rutintevékenységek esetén (minden paramétert meg kell adni) Nem alkalmas, ha több adatot akarunk bevinni felhasználó nem jártas az SQL nyelvben előzetes előszámításokra van szükség felhasználóbarát adatmegjelenítést kell megvalósítani a bevitelre kerülő értékeket egy listából választjuk ki SQL API felületek 5
Megoldás Testre szabott, rugalmasan működő alkalmazói program készítése Adatérték, utasítás kijelölés SQL utasítás ALKALMAZÓI PROGRAM DBMS DB Rács, lista, grafikon Jellemzők: -rugalmas -emberközeli -több funkció SQL API felületek 6
Alkalmazói program feladatai 1. Kapcsolat felvétel ALKALMAZÓI PROGRAM 2. Utasítások elküldése 3. Eredmények fogadása 4. Hiba fogadás, kezelés DBMS Kapcsolat felvétel paraméterei: host, port, adatbázis, felhasználónév, jelszó Utasítások elküldése: SQL utasítások formájában Lehet paraméteres is Eredmények fogadása: Nemcsak DQL esetén van eredmény Kurzor kezelési mechanizmus Hibakezelés: Alkalmazás v. adatbázis rendszer hiba, kivételek SQL API felületek 7
Kliens szerver működésmód Kliens oldal Szerver oldal alkalmazás parancs, művelet eredmény DBMS Parancs fogadás Parancs végrehajtás Eredmény elküldése SQL API felületek 8
Kliens szerver struktúratípusok PC környezet Központi gép buta terminálokkal File szerver struktúra Kétpólusú kliens-szerver Többpólusú kliens-szerver SQL API felületek 9
PC környezet PC Lokális adatok Adatkezelési rutinok Alkalmazás logika egy felhasználós struktúra minden feladatot a PC lát el az összes kód ugyanazon futtatható programba epül be elegendő egy egyszerűbb DB kezelő egység, mert nincs szükség konkurens hozzáférést szabályzó modulra, védelmet szabályzó modulra SQL API felületek 10
Központi gép buta terminálokkal Központi gép: Komponensei: Lokális adatok Adatkezelő komponens Alkalmazói program Feladatai: Osztott elérés biztosítása Adatok védelme Terminálok: Csak megjelenítésre Helyi számítás nincs SQL API felületek 11
File szerver struktúra Központi gép: csak az adatokat tárolja Alkalmazás csomópontok: számítási műveletek adatkezelés minden egyéb művelet Több gépes, rugalmasabb struktúra Pl: Novell Alkalmazás csomópont 1 Alkalmazás csomópont 2 Adat szerver csomópont Alkalmazás csomópont n SQL API felületek 12
Kétpólusú kliens-szerverszerver RPC, Üzenet alapú komm. Alkalmazás logika Megjelenítés Heterogenitás Központi gép DB Adatkezelés SQL API felületek 13
Többpólusú kliens-szerver szerver Alkalmazás szerver 1 Központi gép Alkalmazás szerver 2 DB Adatkezelés Alkalmazás szerver n SQL API felületek 14
Többpólusú kliens szerver II. N-tier struktúra Több alkalmazás szerver: Alkalmazás modularizálható Terheltségfüggő optimalizáció Kliens Kevesebb elem Csak megjelenítés SQL API felületek 15
Kliens-szerver szerver generációk 1. Generáció Kétpólusú modell Procedurális szemlélet RPC alapú adat kapcsolat Osztott, párhuzamos adatelérés támogatás 2. Generáció Többpólusú modell Heterogén környezet Komplex logika támogatása Nagyfokú skálázhatóság OO és üzenet-alapú kapcsolat SQL API felületek 16
I. generáció Lényeges a hálózat terhelése Hálózati forgalom minimalizálása Megoldás: Az adatbázisban tárolunk le bizonyos modulokat Az alkalmazás csak meghívja Hálózatot csak az eredmény terheli Aktív adatbázis objektumok Kétpólusú rendszerek esetén több alternatíva is létezik a feladatok szétosztására SQL API felületek 17
1. Generáció II: Szerver Kliens Fat client Adatbázis kezelés Procedurális logika, adatkezelés, megjelenítés Client-server Adatbázis kezelés, adatkezelés, Procedurális logika, megjelenítés Thin client Adatbázis kezelés, adatkezelés, procedurális logika Megjelenítés SQL API felületek 18
2. generáció RPC mellett újabb technológiák OO alapú Message alapú Közvetlen kapcsolat mellett Közvetítőkön keresztüli üzenetváltások Üzenet közvetítő központ Application server (3 pólusú rendszer) Tranzakció kezelés Heterogén források begyűjtése SQL API felületek 19
2. Generáció II. Adatbázis szerver Adat Fájl szolgáltatások Alkalmazás szerver Üzleti logika Adatkezelés megjelenítés SQL API felületek 20
2. Generáció III. Többpólusú rendszerek: Alkalmazás szervert többszörözik Feladatai: Tranzakciók kezelése Heterogén megjelenítési környezet kezelése Heterogén adatkörnyezet kezelése Terhelés kiegyenlítés Multiplex tranzakciók kezelése Hozzáférés védelmi funkciók SQL API felületek 21
Hálózati komponens Kliens-szerver architektúra fontos része DBMS-ek tartalmaznak hálózati komponenst Mind a kliens, mind a szerver oldalon telepítve kell legyenek Kliens alkalmazás Kliens oldali hálózati komponens Adatbázis szerver Szerver oldali hálózati komponens DB SQL API felületek 22
SQLNet Oracle hálózati komponense Több különböző hálózati protokollt is támogat heterogén kliens-szerver alkalmazások Két komponense van Kliens oldali Szerver oldali Figyel (listener) SQL API felületek 23
SQLNet II. Szerver oldali beállítások Hálózati protokoll típusa Szerver csomópont azonosítása Kommunikációs port 1521 Kapcsolódó adatbázis azonosítója PROTOCOL = TCP HOST = arrakis Kliens oldali beállítások (elérhető listener) Hálózati protokoll típusa Szerver csomópont azonosítása Kommunikációs port 1521 Kapcsolódó adatbázis azonosítója SID_NAME=ORCL PROTOCOL = TCP HOST = arrakis CONNECT_DATA_SID=ORCL SQL API felületek 24
Adatkezelő nyelv DB alkalmazások jellemzői: Adatkezelő elemek Általános vezérlési elemek Adatkezelő nyelv: SQL Egységes szabvány kezelő felület Minden relációs adatforrás támogatja De! mégsem teljesen egységes az adatkezelő nyelv SQL API felületek 25
SQL parancsrendszerek Relációs adatforrásonként különböző Ugyanazon SQL utasítás más hatást válthat ki különböző adatforrásokon Okok: szintaktikai, szemantikai eltérések Nemcsak relációs DBMS-eket használnak Nem adatbázisban történő adattárolás Igény ezek elérésére az alkalmazásból E-mail adatok, táblázatkezelők adatai, WEB-en lévő információk SQL API felületek 26
Egységes adatkezelő felület Probléma: adatkezelő felületek sokfélesége Egymástól eltérő parancsnyelvek Integrációja egy közös programban Következmény: Lelassítja az alkalmazásfejlesztés menetét Megoldás: Egységesíteni kell az adatkezelő felületeket 80-as években kezdődött SQL került ki győztesen SQL API felületek 27
Programfejlesztő környezetek Nincs egységesség 4GL környezet Egyszerűbb kódolás Paraméterezésből áll Generált kódrészletek Fejlesztés során látható eredmények OO környezet OO elvek Objektum és eseményvezérelt elemek Osztályok, csomagok Paraméterezés WEB-es környezet Megjelenítő: böngésző Egységes, elterjedt felület Más programozási stílus WEB szerveren keresztül Aktív/passzív dokumentum Új fejlesztő eszközök 3GL környezet Procedurális nyelv Szövegszerkesztővel készült forrás Beágyazott SQL Alacsony szintű programozási nyelv Hosszadalmas fejlesztés SQL API felületek 28
API felületek Beágyazott SQL CLI, ODBC OO-LI 4GL WEB-LI SQL API felületek 29
Beágyazott SQL SQL utasítások szinte változatlanul a gazdanyelv utasításai között az előzőekben csatlakoztatott adatbázishoz továbbítódnak egyidejűleg egy adatbázis felé él a kapcsolat statikus és dinamikus utasítások Probléma súlypontok: SQL utasítás és gazdanyelv procedurális szemléletének illesztése Adatforgalom megvalósítása Adatforrás halmaz szemlélete gazdanyelv rekordorientált szemlélete Hibaállapotok kezelése SQL API felületek 30
Beágyazott SQL II. - Példa int aar; char[30] atip; EXEC SQL DECLARE auto_cursor CURSOR FOR SELECT tip, ar FROM auto WHERE tip LIKE 'FIAT%' OR tip LIKE 'LADA%' FOR UPDATE OF ar; EXEC SQL OPEN auto_cursor; EXEC SQL WHENEVER NOT FOUND GOTO vege; while (1) { EXEC SQL FETCH auto_cursor INTO :atip, :aar; if (aar < 0) continue; if (atip == 'F') { EXEC SQL UPDATE auto SET ar = ar*1.15 WHERE CURRENT OF auto_cursor; } else { EXEC SQL UPDATE auto SET ar = ar*1.12 WHERE CURRENT OF auto_cursor; } } vege: EXEC SQL CLOSE auto_cursor; SQL API felületek 31
CLI, ODBC A gazdanyelv szintaktikájához idomul Eljárások, függvények hívása a gazdanyelvi környezetben SQL utasítás, mint aktuális paraméter Kapcsolat definiálása is függvénnyel Dinamikus SQL parancsok rugalmasabban kezelhetők Egyidejűleg több adatbázissal történő kapcsolat Nagyobb programozási előkészítést igényel SQL API felületek 32
ODBC Egységes API elérési felület biztosítása ODBC Oracle SQL Server Informix DB2 Postgres MySQL Sybase VFP Access Excel Txt SQL API felületek 33
CLI példa (PHP) <?php $keresk = addslashes($_get["keresk"]); $ar = addslashes($_get["ar"]); $mennyiseg = addslashes($_get["mennyiseg"]); $szin = addslashes($_get["szin"]); $szonyeg = addslashes($_get["szonyeg"]); $conn = mysql_connect("hostname","user","pass") or die ("Hiba"); mysql_select_db("userdb"); $query = "insert into eladas values('".$keresk."','".$ar."','".$mennyiseg."','".$szin."','".$szonyeg."')"; mysql_query($query) or die ("Hiba"); if (mysql_affected_rows() == 0) { echo "A felvitel sikertelen!"; } else { echo "A felvitel sikerult!"; } mysql_close($conn);?> SQL API felületek 34
OO-LI adatkapcsolat példányosítás Művelet végrahajtás Eredmény feldolgozás Csomagok, osztályok objektumok Hibakezelés paraméterezés Végrehajtandó utasítások Beállítási paraméterek SQL API felületek 35
OO-LI (JDBC példa) public OracleSQL(String host, String port, String db, String user, String pass) { try { DriverManager.registerDriver(new oracle.jdbc.driver.oracledriver()); conn = DriverManager.getConnection("jdbc:oracle:thin:@"+host+":"+port+":"+db,user,pass); System.out.println("Kapcsolat az adatbázissal létrejött."); } catch(exception e) { System.err.println(e.getMessage()); } } public int insert(string query) { int count=0; try { stmt = conn.createstatement(); count = stmt.executeupdate(query); stmt.close(); } catch(exception e) { System.err.println(e.getMessage()); } return count; } SQL API felületek 36
4GL RAD (Rapid Application Development) technológia Vizuális editorok Kódolás helyett paraméterezés Nagyfokú futtatási környezet függetlenség Fejlesztés menete: Komponens editor használata Elemek kombinálása, paraméterezése Generált kód Adatbázis kapcsolat és adatbázis objektum szerkesztők használata Adatelérési elemek objektumként, beágyazva v. CLI-ként SQL API felületek 37
4GL II. SQL API felületek 38
WEB-LI Új szabványok: HTML, XML, Java, Python, Változatos fejlesztési környezet Cél: weben való publikálás legyen közös Fejlesztési metódusok: 3GL nyelv + CLI OO nyelv + OO-LI Dokumentumba épített (v. külön) adatkezelő lépések Kimenet: webdokumentum Új fejlesztő környezetek SQL API felületek 39
SQL API logikai struktúrája Kapcsolati struktúrák allokálása Kapcsolat felvétel Kétlépéses végrehajtásnál parancs előkészítése Parancs paraméterezése Parancs végrehajtása Eredmény fogadása Eredmény feldolgozása Kapcsolat zárása SQL API felületek 40
Kapcsolati struktúra, kapcsolat felvétel Kapcsolati struktúra tárolja: Kapcsolódó elemek azonosítását Kapcsolat állapotát Kiadott utasításokat Fellépő hibakódokat. Kapcsolatfelvétel során: Gazdaprogram bejelentkezik a DBMS-be Session-t hoz létre Időigényes folyamat Memória allokálás Szerverszál indítás Metaadat lekérdezés Környezeti változók beállítása bejelentkezési alkalmak minimalizálása Perzisztens kapcsolatok kiépítése SQL API felületek 41
Parancs kiadása, paraméterezése, végrehajtása Direkt közvetlen végrehajtás Előzetes információközlés nélküli parancsküldés Feldolgozás a küldés után Kétlépéses végrehajtás 1. lépés: a gazdaprogram elküldi az SQL parancs vázát DBMS felkészül a tényleges végrehajtásra előkészíti a futtatáshoz szükséges struktúrát (pl. QEP gráf) 2. lépés: gazdaprogram elküldi a teljes SQL parancsot rövidebb ideig tart az előkészítés miatt Előnyök: Nyereség van-e? csak akkor, ha többször futtatjuk egymás után a parancsot Nyelvtani ellenőrzés SQL API felületek 42
Parancs kiadása, paraméterezése, végrehajtása II. Paraméterezés = nincs minden érték megadva a parancs szövegében Helypótlók alkalmazása parancs = SELECT * FROM DOLGOZOK WHERE fizetes >? ;? = paraméter Később, a futás előtt kap értéket Összetett SQL parancs futtatása parancs szövegének elküldése a DBMS-hez Eltérő végrehajtási módok (DQL vs. DML) SQL API felületek 43
Parancs végrehajtási problémák DQL lekérdező parancs esetén Gondoskodni kell a válaszadatok fogadásáról Átküldött adatok gazdanyelvi változók Probléma: a gazdaprogram és a DBMS adatkezelési szemlélete Adatbázis-kezelőkben: Tetszőleges méretű struktúra halmazok NULL érték értelmezése, üres érték fogalma Speciális adattípusok Ellentmondás feloldása: Pl. CURSOR mechanizmus SQL API felületek 44
Halmaz- és rekordorientált adatkezelés halmazmód Több rekord egyidejű kezelése esetén Rekordok törlése rekordmód Egyenként rekord feldolgozás esetén Egyedi módosítások A felhasználó a rekordokat egységesen kezeli A felhasználó egyesével lépkedhet a rekordok között Nincs munkarekord Mindig van munkarekord Navigációs lépések Nincs navigációs lehetőség Ugrás a lista elejére Ugrás a lista végére Ugrás a lista következő elemére Ugrás a lista előző elemére SQL API felületek 45
CURSOR mechanizmus CURSOR létrehozása Kezelő struktúra allokálása CURSOR nyitása CURSOR feldolgozása CURSOR lezárása, felszabadítás SQL API felületek 46
CURSOR létrehozása Alkalmazás Adatbázis kapcsolat Adatbázis CURSOR c1 B tábla A tábla C tábla DECLARE CURSOR c1 AS SELECT Előkészített utasítás SQL API felületek 47
CURSOR feldolgozása Alkalmazás Adatbázis kapcsolat Adatbázis CURSOR c1 OPEN c1 v1 v2 v3 v4 FETCH c1 INTO v1,v2,v3,v4 Előkészített utasítás Eredményhalmaz SQL API felületek 48
CURSOR lezárása Alkalmazás Adatbázis kapcsolat Adatbázis CURSOR c1 CLOSE c1 Eredményhalmaz FREE c1 Előkészített utasítás SQL API felületek 49
CURSOR típusok Statikus CURSOR Kulcsvezérelt CURSOR Dinamikus CURSOR Egyirányú CURSOR Kliens oldali CURSOR Szerver oldali CURSOR Módosítható CURSOR SQL API felületek 50
Statikus CURSOR Eredmény értékek nem változnak Tartalma az induló lekérdezés eredménye Navigáció nem igényel újbóli lekérdezést Nem az aktuális tartalmat mutatja Fizikai megvalósítás: Másolat a kliensen Ideiglenes tábla a szerveren Zárolás a szerveren (vagy multiversion) Módosítás problematikus SQL API felületek 51
Kulcsvezérelt CURSOR Csak a rekordok kulcsértékei határozódnak meg Köztes törlések, módosítások nem változtatják meg a kulcshalmazt Nyitáskor a rekord azonosítók halmaza, sorrendje rögzül Mezőértékek frissülnek menetközben Törölt, változtatott rekordok is benne maradnak SQL API felületek 52
Dinamikus CURSOR Tartalma folyamatosan változhat Minden navigációs lépésnél újból végrehajtódik a lekérdezés Aktuális állapotot mutatja Költséges SQL API felületek 53
Egyirányú, kliens és szerver oldali CURSOR-ok Egyirányú: A gazdaprogram csak előre tud lépkedni Kliens oldali: A rekordlista a kliens gépen tárolódik Szerver oldali: A rekordlista a szerveren tárolódik SQL API felületek 54
Módosítható CURSOR Módosításra használjuk Rekord mellett logikai címet megadó pointer is jelen van Módosításkor az alaptáblában lévő adatot a pointer alapján kapjuk SQL API felületek 55
CURSOR-ok összehasonlítása Aktualitás Konkurencia Teljesítmény Statikus - ++ + Kulcs-vezérelt + + + Dinamikus ++ -+ -+ SQL API felületek 56
SQL API absztrakt adatkezelő parancsai DB Adatbázis szimbólum T Reláció szimbólum C CURSOR szimbólum t Egy rekord szimbóluma O(DB,s) Kapcsolat kiépítés a DB felé, ahol s egy kapcsolat leíró paraméter c(db) Kapcsolat zárása q(t DB,f) A T halmazból az f feltételt teljesítő rekord lekérdezése x=q(t DB1,T DB2,,f) A T 1, T 2, halmazok joinjából az f feltételt teljesítő rekord lekérdezése, ahol egy rekordot ad vissza a lekérdezés (most csak SPJ lekérdezések) SQL API felületek 57
SQL API absztrakt adatkezelő parancsai II. C=q(T DB1,T DB2,,f) A C CURSOR előállítása a T 1, T 2, halmazokra vonatkozó lekérdezéssel i(t DB,t ) A t rekord felvitele a T halmazba a (C,t ) A rekord hozzáfűzése a C lista végére d(t DB,f) A T halmazból az f feltételnek megfelelő rekordok törlése d (C) A C listából az aktuális rekord törlése u(t DB,t,f) A T halmazból az f feltételnek megfelelő rekordok módosítása a megadott értékre u (C,t ) A T listából az aktuális rekord módosítása a megadott értékre n (C,p) A T listában navigációs lépés a p iránynak megfelelően. Az alapértelmezett navigációs irányok: 0:eleje,1:vége,+1:előre lép egyet,-1:visszalép egyet. SQL API felületek 58
SQL API absztrakt adatkezelő parancsai III. Vezérlőelemek main(x,y, ) Főprogram x = y Értékadás x = input( prompt ) Érték beolvasása if (f) { } Feltételes végrehajtás while (f) { } Ciklus do { } while (f) ciklus SQL API felületek 59
Példa 1. Minta adatbázis: DOLGOZO[kod,nev,beosztas,fizetes,ado] Feladat Új dolgozórekord felvitele Megoldás main() { x = input( nev ); y = input( beosztas ); z = input( fizetes ); o(db,s); k = q(dolgozo, max(kod))+1; i(dolgozo, (k,x,y,z)); c(db); } SQL API felületek 60
Példa 1I. Minta adatbázis: DOLGOZO[kod,nev,beosztas,fizetes,ado] Feladat X beosztásúak fizetésének növelése Y értékkel. X értéket olvassuk be. Megoldás main() { X = input(); s = input(); o(db,s); u(dolgozo, fizetes = fizetes+y, beosztas=x); c(db); } SQL API felületek 61
Példa III. Minta adatbázis: DOLGOZO[kod,nev,beosztas,fizetes,ado] Feladat Számoljuk ki az adó értékét egy adoszam() fv. meghívásával! Aktualizáljuk a DOLGOZO táblát! Megoldás main() { s = input(); o(db,s); Q = q(dolgozo,*); n (Q,0); do { Y = adoszam(q.fizetes); u (Q,ado=Y); } while (n (Q,+1)); c(db); } SQL API felületek 62
Köszönöm a figyelmet! SQL API felületek 63