Adatbázis-szerverek. Hallgatói segédlet

Hasonló dokumentumok
SQL ALAPOK. Bevezetés A MYSQL szintaxisa Táblák, adatok kezelésének alapjai

Adatbázisok. 8. gyakorlat. SQL: CREATE TABLE, aktualizálás (INSERT, UPDATE, DELETE), SELECT október október 26. Adatbázisok 1 / 17

Adattípusok. Max. 2GByte

Adattípusok. Max. 2GByte

Adatbázis-lekérdezés. Az SQL nyelv. Makány György

Tartalomjegyzék. Tartalomjegyzék 1. Az SQL nyelv 1 Az SQL DDL alapjai 2

8. Gyakorlat SQL. DDL (Data Definition Language) adatdefiníciós nyelv utasításai:

A relációs adatbáziskezelés szabványos nyelve Két fő csoportba sorolhatók az utasításai

Adatbázis-kezelés. Harmadik előadás

Vizuális programozás gyakorlat

Adatbázis kezelés Delphiben. SQL lekérdezések

Bevezetés: az SQL-be

B I T M A N B I v: T M A N

Tranzakciókezelés PL/SQL-ben

BEVEZETÉS Az objektum fogalma

ADATBÁZIS-KEZELÉS - BEVEZETŐ - Tarcsi Ádám, ade@inf.elte.hu

SQL parancsok feldolgozása

Az SQL nyelv Structured Query Language (Struktúrált lekérdező nyelv)

Adatbázisok. 8. gyakorlat. SQL: CREATE TABLE, aktualizálás (INSERT, UPDATE, DELETE) október október 22. Adatbázisok 1 / 14

Adatbázisok elmélete 10. előadás

SQL- Utasítások csoportosítása Definíció: DDL: - objektum létrehozás CREATE - objektum megszüntetés DROP - objektum módosítás ALTER

Adatbázis rendszerek SQL nyomkövetés

Adatbázisok. 2. gyakorlat SQL november november 12. Adatbázisok 1 / 31

SQL haladó. Külső összekapcsolások, Csoportosítás/Összesítés, Beszúrás/Törlés/Módosítás, Táblák létrehozása/kulcs megszorítások

Adatbázisok-1 előadás Előadó: dr. Hajas Csilla

Adatbázisok elmélete 9. előadás

Adatbázisok elmélete 9. előadás

SQL*Plus. Felhasználók: SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP (dolgozó), DEPT (osztály) "közönséges" felhasználók

Informatikai képzés Információs rendszerek dr. Hajas Csilla (ELTE IK)

Adatbázisok I. Definíció: DDL: - objektum létrehozás CREATE - objektum megszüntetés DROP - objektum módosítás ALTER

Adatbázisok. 9. gyakorlat SQL: SELECT október október 26. Adatbázisok 1 / 14

Adatbázis Rendszerek I. 9. SQL alapok (DDL esettanulmány)

ADATBÁZISOK gyakorlat: SQL 2. rész SELECT

SQL. Táblák összekapcsolása lekérdezéskor Aliasok Allekérdezések Nézettáblák

A gyakorlat során MySQL adatbázis szerver és a böngészőben futó phpmyadmin használata javasolt. A gyakorlat során a következőket fogjuk gyakorolni:

ADATBÁZIS-KEZELÉS FÉLÉVES FELADAT

SQL. 1.rész. 1.elıadás // Adatbázisok-1 elıadás // Ullman-Widom (Stanford) tananyaga alapján // Hajas Csilla (ELTE IK) 1

Az indexelés újdonságai Oracle Database 12c R1 és 12c R2

Relációsémák létrehozása SQL nyelvben

1. RDBMS alapok: miből áll az SQL Server adatbázis? 1

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 4.ELŐADÁS. Adatbázis alapú alkalmazások készítése PHP-ben

Java és web programozás

BASH script programozás II. Vezérlési szerkezetek

Célkitűzések Az Oracle10 g felépítésének, használatának alapszíntű megismerése

STRUCTURED QUERY LANGUAGE(SQL) - ALAPOK

Adatbázis-kezelés, információs-rendszerek

SQL DDL-1: táblák és megszorítások

Bevezetés az SQL-be. Tankönyv: Ullman-Widom: Adatbázisrendszerek Alapvetés Második, átdolgozott kiadás, Panem, 2009

Tábla létrehozása: CREATE TABLE alma( ID INT( 3 ) NOT NULL PRIMARY KEY, Leiras VARCHAR( 100 ) );

SQL DDL-2 (aktív elemek) triggerek

Adatbázis-kezelés alapok Adatbázisok című tárgyhoz, ismétlés kapcsán

Adatbáziskezelő-szerver. Relációs adatbázis-kezelők SQL. Házi feladat. Relációs adatszerkezet

SZÁMÍTÓGÉPES PROBLÉMAMEGOLDÁS

Az SQL nyelv. SQL (Structured Query Language = Strukturált Lekérdező Nyelv).

LOGISZTIKAI ADATBÁZIS RENDSZEREK BEVEZETÉS

Gyakorlás: Hozzunk létre egy Alkalmazottak táblát AZO szám, Részleg szöveg, Munkakör szöveg és BelépésDátuma dátum típussal.

Haladó DBMS ismeretek 1

SQL PÉLDATÁR. készült a PTE TTK Iskolai informatika III. kurzus teljesítésére

Készítette: Szabóné Nacsa Rozália

Adatbázis Rendszerek II. 1. SQL programozási felületek 39/1B IT MAN

A könyv tartalomjegyzéke

Adatbázis Rendszerek II. 8. Gyakorló környezet

Adatbázisok* tulajdonságai

LOGISZTIKAI ADATBÁZIS RENDSZEREK JOIN, AGGREGÁCIÓ

Adatbázis rendszerek. Molnár Bence. Szerkesztette: Koppányi Zoltán

Adatbázis, adatbázis-kezelő

LBRA6i integrált rendszer

Adatbázis Rendszerek II. 2. Gyakorló környezet

BGF. 4. Mi tartozik az adatmodellek szerkezeti elemei

OO PDO. Tehát PDO használatával, könnyen átállhatunk egy másik adatbáziskezelőre, anélkül hogy a kódot teljes egészében újraírnánk.

Adatbázis Rendszerek I. 10. SQL alapok (DML esettanulmány)

AB1 ZH mintafeladatok. 6. Minősítse az állításokat! I-igaz, H-hamis

Relációs algebra áttekintés és egy táblára vonatkozó lekérdezések

SQL jogosultság-kezelés. Privilégiumok Grant és Revoke Grant Diagrammok

A gyakorlat során MySQL adatbázis szerver és a böngészőben futó phpmyadmin használata javasolt. A gyakorlat során a következőket fogjuk gyakorolni:

Java és web programozás


Megszorítások. AB1_06A_Megszorítások - Adatbázisok-1 EA (Hajas Csilla, ELTE IK) - J.D. Ullman elıadásai alapján

SQLServer. DB Recovery modes

Adatbázis használat I. 5. gyakorlat

Adatbázis rendszerek. Molnár Bence. Szerkesztette: Koppányi Zoltán

Adatbáziskezelı-szerver SQL. Relációs adatbázis-kezelık. Relációs adatszerkezet. Házi feladat

PL/SQL (folytatás) Kurzorok, függvények, eljárások

Debreceni Egyetem Informatikai Kar TANULÓI NYILVÁNTARTÓ SZOFTVER FIREBIRD ADATBÁZIS ALKALMAZÁSÁVAL

Elemi alkalmazások fejlesztése IV.

Adatbázisok-I. előadás dr. Hajas Csilla (ELTE IK)

Az SQL adatbázisnyelv: DML

Szkriptnyelvek. 1. UNIX shell

ADATBÁZIS RENDSZEREK I BEADANDÓ

Kilencedik témakör: Lazarus-Firebird. Készítette: Dr. Kotsis Domokos

Adatbázis Rendszerek II. 2. Ea: Gyakorló környezet

Adatbázis Rendszerek II. 6. PLSQL Triggerek 32/1B IT MAN

A C# programozási nyelv alapjai

Adatbázisok tavaszi félév Vizsgatételsor

Adatbázisok I A relációs algebra

Programozás. Adatbázis-kezelés (alapok) Fodor Attila

MS ACCESS 2010 ADATBÁZIS-KEZELÉS ELMÉLET SZE INFORMATIKAI KÉPZÉS 1

Adatbázis tartalmának módosítása

3. Előadás. Az SQL adatbázisnyelv (Tartalom) Az SQL története. Az SQL felépítése. Adattípúsok. SQL utasítások

Adatmodellezés. 1. Fogalmi modell

Átírás:

Adatbázis-szerverek Hallgatói segédlet (a gyakran használt Transact-SQL-utasítások összefoglalása. Az SQL Server Books Online alapján összeállította Karácsony Péter ILIAS-lap: http://ilias.gdf.hu/ilias.php?baseclass=illmpresentationgui&ref_id=16036&cmd=resume Tartalom Tartalom... 1 Bevezető... 4 A minta (VIZSGA) adatmodell... 4 A táblák tartalma:... 5 A fejlesztőkörnyezet... 7 A kommunikációs eszköz (Transact-SQL)... 7 Először néhány fogalmat tisztázunk... 7 Rendszeradatbázisok... 7 Felhasználói adatbázisok... 8 1. oldal Adatbázis-szerverek - összefoglaló

Adatbázis-objektumok... 8 Az objektumok azonosítása:... 9 A T-SQL elemei... 9 T-SQL-utasítások csoportosítása... 9 T-SQL-utasítások végrehajtása...10 Transact-SQL (kivonat a BOL alapján)...10 DDL (adatdefiníciós nyelv)... 11 USE (adatbázis használatba vétele)...12 CREATE DATABASE (adatbázis létrehozása)...12 CREATE TABLE (tábla létrehozása)...13 ALTER TABLE (tábla módosítása)...15 DROP TABLE (tábla törlése)...16 DML (adatmanipulációs nyelv)... 17 INSERT (új sorok beillesztése)...17 UPDATE (sorok módosítása)...19 DELETE (sorok törlése)...20 DQL (adatlekérdező nyelv)... 20 SELECT (eredménytábla előállítása)...21 A WITH...21 Vezérlőszerkezetek (procedurális nyelv)... 24 DECLARE (lokális változó deklarálása)...25 SET (skalárváltozó-értékadás)...25 BEGIN... END (szekvencia)...26 2. oldal Adatbázis-szerverek - összefoglaló

IF... ELSE (szelekció)...26 WHILE (iteráció)...27 TRY... CATCH (egyszerű hibacsapdázás)...27 RAISERROR függvény (hiba generálás)...27 PRINT (szöveges üzenet a kliensnek)...28 Adatbázisban tárolt programelemek... 29 Típusai:...29 Beépített függvények...30 Felhasználói függvények...30 CREATE FUNCTION (felhasználóifüggvény-definiálás)...30 Skalár-értékű függvény...30 In-line tábla-értékű függvény...32 Multistatement táblaértékű függvény...33 A rendszer tárolt eljárásai...38 Felhasználói tárolt eljárások...38 CREATE PROCEDURE (tárolt eljárás definiálása)...39 DML-triggerek...43 CREATE TRIGGER (DML trigger definiálása)...43 Tranzakciókezelés... 47 BEGIN TRASACTION (tranzakció indítása)...47 COMMIT TRANSACTION (tranzakció elfogadtatása)...48 ROLLBACK TRANSACTION (tranzakció visszagörgetése)...48 3. oldal Adatbázis-szerverek - összefoglaló

Bevezető Jelen segédlet az Adatbázis-szerverek tárgy gyakorlati alkalmazásához próbál segítséget nyújtani. Konkrét fejlesztőkörnyezetben (SQL Server 2008 Express) egy konkrét probléma (Hallgatók vizsgaeredményeinek nyilvántartása egy elképzelt főiskolán) megoldására teszünk kísérletet. Az anyag a többrétegű szoftverfejlesztés adat-rétegének megvalósítását követi végig. Ehhez a (microsoftos) szerver-környezet kommunikációs eszközének (T-SQL) lehetőségeit veszi sorra. Ne feledjük, hogy az anyagunk erősen kivonatos (a szintaktikai megfogalmazások nagyon leegyszerűsítettek!), arra koncentrál, hogy a tárgy kimeneti követelménye teljesíthető legyen. A témakör teljesebb, igényesebb feldolgozásához rendelkezésre áll a szerverhez tartozó online dokumentáció (SQL Server Books Online). Az anyag feldolgozásához természetesen szükséges előző modulok (Adatbázisok, Programozás) alapos ismerete. A minta (VIZSGA) adatmodell Példánkban egy általános főiskola hallgatóinak tanulmányi eredményeit tartjuk nyilván. Az iskolával kapcsolatba kerülő személyek között szerepelnek a tanárok, és közülük kerülnek ki a hallgatók is, akik a meghirdetett szakokra jelentkeztek. 4. oldal Adatbázis-szerverek - összefoglaló

A hallgatók tanulmányaikat a szakoknak megfelelő tematika szerint szemeszterekre osztva végzik. A tematikában felsorolt tárgyak teljesítésének legfeljebb egy kötelezően előírt előzmény tárgy teljesítése a feltétele. A teljesítés tematika szerint meghirdetett vizsgákon történik, amelyhez a hallgató jelentkezés útján jut el. Ezekből következnek a kapcsolatok: személy hallgató o 1:1 o egy hallgató itt egyetlen szak! szak tantárgy o n:m o ezért: tematika szak és tematika tantárgy o n:1 tematika tematika o 1:m o most legfeljebb egy előzmény A többi kapcsolat értelemszerű. A táblák tartalma: MEZŐ ADATTÍPUS LEÍRÁS szak szkód char(3) azonosító szak varchar(50) a szak megnevezése szemeszter tinyint maximális szemeszter tantárgy tkód char(4) azonosító 5. oldal Adatbázis-szerverek - összefoglaló

elnevezés varchar(30) a tantárgy elnevezése vez_tanár int tantárgyvezető azonosítója (személyből) tematika szak char(3) a szak azonosítója tárgy char(4) a tárgy azonosítója szemeszter tinyint a tárgy szemesztere szakon belül előzmény char(4) a vizsgához (esetlegesen) szükséges tárgy azonosítója személy szkód int azonosító név varchar(50) a személy neve szül_dátum date születési dátum hallgató hkód int azonosító (kapcsolat személyhez) szak char(3) az iskolai szak kódja akt_szem tinyint a hallgató aktuális szemesztere vizsga vizsga int azonosító szak char(3) a szak azonosítója tárgy char(4) a tárgy azonosítója idő smalldatetime a vizsga időpontja tanár int az értékelő tanár azonosítója max_fő smallint maximális létszám jelentkezés hkód int hallgató azonosító vizsga int vizsga azonosító szem tinyint a hallgató aktuális szemesztere jegy tinyint érdemjegy (0 nem jelent meg) 6. oldal Adatbázis-szerverek - összefoglaló

A fejlesztőkörnyezet MS SQL Server 2008 Express (letölthető a Microsoft oldaláról) SQL alapú relációs adatbáziskezelő, a szerver oldal. Installálása nem jelenthet gondot. Számunkra komponensei közül (egyelőre) csak a motor (Database Engine) szükséges. SQL Server Management Studio (letölthető a Microsoft oldaláról) egy már jól megszokott objektumorientált vizuális szerkesztőfelület, a kliens-oldal. Számunkra szükséges használata rövid idő alatt elsajátítható. SQL Server Books Online (BOL a 2008 R2-höz letölthető a Microsoft oldaláról) egy mint a neve is utal rá teljes felhasználói dokumentáció. Használata elengedhetetlen. Jelen segédlet is ez alapján készült, ennek egy igen nagyvonalú, a számunkra feltétlenül szükséges elemek kivonatos része. Használata egyértelmű. A kommunikációs eszköz (Transact-SQL) A már jól ismert szabvány SQL kiegészítve procedurális nyelvi elemekkel. Anyagunkban csupán a fejlesztéshez szükséges alapvető elemeket vesszük sorba, nem foglalkozunk a rendszeradminisztrátor és a rendszergazda tevékenységeivel. Először néhány fogalmat tisztázunk Az SQL Server: (számunkra) adatbázisokból áll. Rendszeradatbázisok Master a tulajdonképpeni rendszerkatalógus metaadatokkal 7. oldal Adatbázis-szerverek - összefoglaló

Modell minta, amely alapján a felhasználói adatbázis szerkezete kialakul Msdb a szerver felügyelet ütemezéséhez szükséges (nem foglalkozunk vele) Tempdb ideiglenes objektumok kezelését biztosítja Felhasználói adatbázisok Név a rendszertervünk alapján létrehozott adatbázis Adatbázis-objektumok Ezek összességét tekintjük adatbázisnak tábla (table) az adatok tárolására szolgál, a modell relációiból keletkezik nézet (view) virtuális tábla, tárolt select. Adatbiztonsági illetve feldolgozás hatékonysági szerepe van. index (index) logikai (fizikai) rendezése a táblának, nézetnek. Feldolgozás hatékonysági szerepe van. függvény (function) - programozási egység tárolt eljárás (procedure) programozási egység az üzleti logika megvalósításához. trigger (trigger) speciális eljárás, amely végrehajtását események váltják ki. megszorítás (constraint) adatintegritás megőrzésének egyik eszköze. Az objektumok úgynevezett sémákba (schema) vannak rendezve. A séma egy konténernek tekinthető, amely adatbázis objektumokat tartalmaz. Nagy méretű (sok tábla) adatbázis esetén célszerű a használata, jelen anyagunkban nem foglalkozunk vele. Az alapértelmezett séma (automatikusan létrejön) a dbo nevet kapja. 8. oldal Adatbázis-szerverek - összefoglaló

Az objektumok azonosítása: <Szerver_név>.<adatbázis_név>.<séma_név>.<objektumnév> Alapértelmezett értékek: szerver - lokális adatbázis - kiválasztott séma - a kapcsolathoz rendelt (esetünkben dbo) konstans változó függvény operátor kifejezés utasítás A T-SQL elemei Bármely egyéb programozási környezetben megszokott fogalmak. Részletesen később. T-SQL-utasítások csoportosítása DDL (adat definíció) adatbázis objektumok előállítása, karbantartása (CREATE, ALTER, DROP) DML (adat manipuláció) adatok tárolása, módosítása, törlése (INSERT, UPDATE, DELETE) DQL (adat lekérdező) eredmény tábla előállítása (SELECT ) TCL (tranzakció vezérlő) tranzakció kezelés (COMMIT, ROLLBACK) 9. oldal Adatbázis-szerverek - összefoglaló

Vezérlőszerkezetek az egyéb procedurális környezetben megismert lehetőségek (deklaráció, szekvencia, szelekció, iteráció) T-SQL-utasítások végrehajtása Végrehajtási egység a köteg (batch), amely T-SQL-utasítások sorozata. Minden köteget egységként értelmez az adatbázismotor, egységként hajtja végre. A kötegeket szkriptekben helyezhetjük el. Az sqlszkript egy szövegfájl alapértelmezett.sql kiterjesztéssel. A szkriptben az egyes kötegeket a utasítással zárjuk. (A nem T-SQL-parancs!) Egyelőre két lehetőségünk van a szkriptek futtatására (végrehajtására): SQLCMD (rendszer-segédprogram) paraméterezését lásd: BOL. Management Studio new query hatására megnyíló kódszerkesztő. A szerkesztőben megírt szkriptet az execute eszközgombbal hajtatjuk végre. Természetesen szinte minden előállítható vizuális eszközök segítségével is a felületen (és természetesen ezekből megfelelő szkriptek generálhatóak), ezen anyag ezzel nem foglalkozik. Az ismerkedés során ez utóbbi a javasolt. Az anyag későbbi részeiben példaként megadott kódok szkriptként értelmezendők. Transact-SQL (kivonat a BOL alapján) Jelölési konvenciók (igyekszem betartani): UPPERCASE Transact-SQL-kulcsszó 10. oldal Adatbázis-szerverek - összefoglaló

italic bold underline Szimbólum (azonosító). Szöveg, amit kötelezően így kell megadni. Elhagyás esetén alapértelmezett érték. (vertical bar) Választható értékek elválasztása. [ ] (brackets) Opcionális szintaktikus elem. { } (braces) Szükséges szintaktikus elem. [,...n] [...n] Megelőző elem ismétlése vesszővel elválasztva. Megelőző elem ismétlése szóközzel elválasztva. ; Transact-SQL-utasítás végénét jelzi (nem szükséges, sőt...) <label> ::= Elnevezett szintaktikus blokk. Kifejtése később megtalálható. Megjegyzések elhelyezése a kódban: -- sorvégi megjegyzés /* többsoros megjegyzés (blokk)... [...] */ DDL (adatdefiníciós nyelv) Alapvetően három parancs (létrehozás, módosítás, törlés) tartozik ide az összes adatbázis objektumra vonatkozóan. Itt most csupán a már 11. oldal Adatbázis-szerverek - összefoglaló

ismert objektumok (táblák) kezelését tekintjük át. A többire (függvény, eljárás,) később kerül sor. Nem ebbe a kategóriába tartozik, viszont meg kell említeni az aktuális adatbáziskiválasztás utasítását. (Emlékszünk, az SQL utasításai mindig az aktuális (nyitott) adatbázison operálnak.) USE (adatbázis használatba vétele) A megadott nevű adatbázis lesz az aktuális. Minden további utasítás ezen fog végrehajtódni. USE ab_név CREATE DATABASE (adatbázis létrehozása) A megadott nevű felhasználói adatbázist létrehozza az esetlegesen megadott helyen és méretekkel. Két fizikai állomány keletkezik: adatterület, naplófájl. CREATE DATABASE db_név [ ON [ PRIMARY ]([ NAME=log_név, FILENAME='fiz_név' ]) [, SIZE=méret ] [, MAXSIZE={max_ méret UNLIMITED } ] [, FILEGROWTH=növekmény ] ] [ LOG ON (NAME=log_név, FILENAME='fiz_név'] ) [, SIZE=méret ] [, MAXSIZE={max_ méret UNLIMITED } ] [, FILEGROWTH=növekmény ] ] [ COLLATE collation_név ] ] 12. oldal Adatbázis-szerverek - összefoglaló

Példa create_db.sql -- master a renszerkatalógus USE master /* létrehozzuk a példáinkban használt vizsga adatbázist egy megadott elérési úton */ CREATE DATABASE vizsga ON PRIMARY (NAME=vizsga, FILENAME='E:\sqls2008r2\adat\vizsga.mdf') LOG ON (NAME=vizsga_log, FILENAME='E:\sqls2008r2\adat\vizsga.ldf') CREATE TABLE (tábla létrehozása) Megadott névvel létrehoz egy adattáblát a megadott oszlopokkal, illetve alapvető megszorításokkal, mint kulcs (PRIMARY KEY, UNI- QUE), idegen kulcs (FOREIGN KEY), sorszintű feltétel (CHECK). Lehetőség van ideiglenes tábla létrehozására (a tábla neve #-al kezdődik), amely láthatósága és élettartama az őt létrehozó kapcsolat (session). CREATE TABLE tábla_név ( { <oszlop_definíció> [<tábla_megszorítás>] } [,...n ] ) <oszlop_definíció>: oszlop_név <adat_típus> [ NULL NOT NULL ] [ [ DEFAULT (konstants) ] [ IDENTITY [ (kezdőérték, növekmény) ] ] ] 13. oldal Adatbázis-szerverek - összefoglaló

<tábla_megszorítás>: CONSTRAINT név { { PRIMARY KEY UNIQUE } (oszlop [ ASC DESC ] [,...n ] ) FOREIGN KEY (oszlop [,...n ] ) REFERENCES hivatkozott_tábla [ ( hiv_oszlop [,...n ] ) ] CHECK ( logikai_kif ) } Gyakrabban használt adattípusok: CHAR(n),VARCHAR(n MAX) NCHAR(n),NVARCHAR(n MAX) DATE,DATETIME,SMALLDATETIME,TIME DECIMAL(pontosság,skála) FLOAT(n),REAL INT,BIGINT,SMAL- LINT,TINYINT Példa: create_table.sql /* a rendszer három tábláját hozzuk létre, kapcsolataikkal együtt */ USE vizsga CREATE TABLE szak ( szkód char(3) NOT NULL, szak varchar(50) NOT NULL, szemeszter tinyint NOT NULL, CONSTRAINT PK_szak PRIMARY KEY (szkód ASC)) 14. oldal Adatbázis-szerverek - összefoglaló

CREATE TABLE személy( szkód int IDENTITY(1,1) NOT NULL, név varchar(50) NOT NULL, szül_dátum date NOT NULL, CONSTRAINT PK_személy PRIMARY KEY(szkód)) CREATE TABLE hallgató( hkód int NOT NULL, szak char(3) NOT NULL, akt_szem tinyint NOT NULL DEFAULT (1), CONSTRAINT PK_hallgató PRIMARY KEY (hkód), CONSTRAINT FK_hallgató_szak FOREIGN KEY(szak) REFERENCES szak (szkód), CONSTRAINT FK_hallgató_személy FOREIGN KEY(hkód) REFERENCES személy (szkód) ) ALTER TABLE (tábla módosítása) Meglévő oszlop módosítása, törlése illetve új oszlop hozzáadása. Ugyancsak ez az utasítás szolgál táblamegszorítás hozzáadására és törlésére. ALTER TABLE tábla_név { ALTER COLUMN <oszlop_definíció> ADD { 15. oldal Adatbázis-szerverek - összefoglaló

} <oszlop_definíció> < tábla_megszorítás> } [,...n ] DROP { [ CONSTRAINT ] constraint_ név COLUMN oszlop_név } [,...n ] Példa: alter.sql /* módosítjuk a szak tábla szemeszter oszlopát úgy, hogy alapértelmezett értéke 6 legyen, lehetséges értéke pedig 1 és 8 közé eshet */ USE vizsga ALTER TABLE szak ADD CONSTRAINT DF_szak_szemeszter DEFAULT (6) FOR szemeszter, CONSTRAINT CK_szak_szemeszter CHECK (szemeszter>=1 AND szemeszter<=8) DROP TABLE (tábla törlése) A megadott táblá(ka)t törli azadatbázisból DROP TABLE tábla_név [,...n ] Feladat: 16. oldal Adatbázis-szerverek - összefoglaló

Hozza létre a többi táblát, kapcsolatokkal, egyszerű megszorításokkal! Készítsen diagramot, amely az összes táblát tartalmazza és ellenőrizze a kapcsolatokat! DML (adatmanipulációs nyelv) A valóság változásának követéséhez szükséges, jól ismert három parancs tartozik a körbe. Az érdeklődők a nyelvi leírásban utána nézhetnek a specialitásoknak, ezek adott probléma megoldása esetén szebb megoldásokat eredményezhetnek. Arra azonban szükségünk lesz, hogy a végrehajtás módját kissé megvizsgáljuk. Mindhárom utasítást (insert, update, delete) a motor tranzakcióként (később részletezzük) hajtja végre, és e tranzakció során két logikai táblát hoz létre az előtti illetve az utána állapotnak megfelelően, melyek hivatkozhatóak az utasítás OUTPUT cikkelyében (l. BOL), valamint az érintett táblára alkalmazott trigger (később) végrehajtása során. A két tábla: INSERTED az utasítás által létrehozott új adattartalmú sorokat tartalmazza (delete esetén üres) DELETED az utasítás által megszűntetett adattartamú sorokat tartalmazza (insert esetén üres) INSERT (új sorok beillesztése) Új adatsor(ok) beillesztése az adott adattáblába. Az értékek felsorolásán kívül lehetőségünk van egy eredménytábla soraival történő feltöltésre is. Opcionálisan a végrehajtás eredményét tárolhatjuk másik 17. oldal Adatbázis-szerverek - összefoglaló

táblában (OUTPUT). Az OUTPUT kifejezéseiben hivatkozhatunk az INSERTED táblára is. INSERT [INTO] tábla_név [ ( oszlop, ) ] [ OUTPUT kif, [ INTO tábla_név ] ] { VALUES ( { DEFAULT NULL kif } [, n ]) [, n] <eredmény tábla> DEFAULT VALUES } Példa: insert.sql /* írjunk mintasorokat az előzőleg létrehozott táblákba */ USE vizsga INSERT INTO szak VALUES ('IKN','Informatikus közgazdász',6) INSERT INTO szak VALUES ('IKT','Informatikus közgazdász táv',6), ('MIN','Mûszaki informatikus',7), ('MIT','Mûszaki informatikus táv',7) INSERT INTO személy VALUES ('Ábel Ábel','1986.03.23'), ('Ábel Ágota','1988.05.02'), 18. oldal Adatbázis-szerverek - összefoglaló

('Ábel Attila','1987.05.02'), ('Ábel Benjamin','1988.03.16') /* az összes személyt vegyük fel távos műszakinak */ INSERT INTO hallgató (hkód,szak) SELECT szkód,'mit' FROM személy UPDATE (sorok módosítása) Adatok módosítása az adott adattáblában. Az oszlopok új értékeinek kifejezésében hivatkozhatunk a FROM által előállított eredménytábla oszlopaira. Opcionálisan a végrehajtás eredményét tárolhatjuk másik táblában (OUTPUT). Az OUTPUT kifejezéseiben hivatkozhatunk az INSERTED és a DELETED táblákra is. UPDATE tábla_név SET { oszlop = { kif DEFAULT NULL } } [, ] [ OUTPUT kif, [ INTO tábla_név ] ] [ FROM tábla_név, ] [ WHERE { <feltétel> } ] Példa: update.sql /* az összes első szemeszteres hallgatónkat tegyük át a következő (második) szemeszterbe */ USE vizsga 19. oldal Adatbázis-szerverek - összefoglaló

UPDATE hallgató SET akt_szem=akt_szem+1 WHERE akt_szem=1 DELETE (sorok törlése) Adatsor(ok) törlése az adott adattáblában. A törlendő sorok meghatározásánál hivatkozhatunk a FROM által előállított eredménytábla oszlopaira. Opcionálisan a végrehajtás eredményét tárolhatjuk másik táblában (OUTPUT). Az OUTPUT kifejezéseiben hivatkozhatunk a DELETED táblára is. DELETE tábla_név [ OUTPUT kif, [ INTO tábla_név ] ] [ FROM tábla_név, ] [ WHERE { <feltétel> } ] Feladat: Töltse fel megfelelő mintasorokkal a táblákat (Használja a vizuális felületet is)! DQL (adatlekérdező nyelv) Tulajdonképpen nem kellene külön foglalkoznunk vele, hiszen az Adatbázisok tárgy keretében mindenki alaposan elsajátította az ide tartozó egyetlen utasítás (SELECT) használatát. Az ott megismert szabvány nyújtotta lehetőségek elegendőek egy általános probléma megoldásához. Anyagunkban csupán még egyszer összefoglaljuk e lehetőségeket, röviden kitérve néhány újra. Ne feledjük, hogy ez a 20. oldal Adatbázis-szerverek - összefoglaló

(szinte) egyetlen lehetőségünk adatok, információk kinyerésére az adatbázisból, ezért biztos használata elengedhetetlen a fejlesztés során. SELECT (eredménytábla előállítása) Az adatbázisban tárolt adatok alapján egy új un. eredmény tábla létrehozása. Ez lehet csupán egy feldolgozás részeredménye, amelyre a feldolgozás során lehet szükségünk, de természetesen a fejlesztendő rendszertől elvárható hasznos információ is ilyen formában áll elő. [ WITH <common_table_expression>] SELECT <select_lista> [ INTO új_tábla ] [ FROM <tábla_forrás> ] [ WHERE <kiválasztási_feltétel> ] [ [ GROUP BY <csoportosítási_szempont> ] [ HAVING <kiválasztási_feltétel>] ] [ ORDER BY <sorrend_kif> [ ASC DESC ] ] Az egyetlen új szintaktikai egység a WITH cikkely. Segítségével olyan eredmény táblákat definiálhatunk, amelyekre a tényleges SELECTben mint adattáblákra hivatkozhatunk. Szerepe gyakorlatilag megegyezik a VIEW lehetőségeivel, ám e táblákra csak az adott utasításban hivatkozhatunk. Jelentősége abban áll, hogy rekurziót tudunk programozni a segítségével, ám ezzel jelen anyagunk nem foglalkozik (l. BOL). A WITH WITH <common_table_expression> [,...n ] ] <common_table_expression>::= 21. oldal Adatbázis-szerverek - összefoglaló

tábla_név [ (oszlop_név [,...n ] ) ] AS ( <eredmény_tábla_definíció> ) Példa: cte1.sql /* példaként szerepelhet a megszámolt elemek legnagyobbikának kiválasztása, amely az egyes szabvány szerint két lépés. Mely szakra járnak legtöbben? */ USE vizsga WITH szakként (szak,fõ) AS (SELECT szak,count(*) FROM hallgató GROUP BY szak) SELECT szak FROM szakként WHERE fõ=(select MAX(fõ) FROM szakként) A SELECT cikkely újdonsága, hogy önmagában is állhat, ez esetben értékadásként szerepel. Használható benne a TOP opció, amely az eredménytábla sorainak korlátozása. SELECT [ ALL DISTINCT ] [ TOP ( kif ) [ PERCENT ] [ WITH TIES ] ] <select_list> <select_list> ::= { [tábla_név.]* <SQL_kif> [ [ AS ] oszlop_alias ] } column_alias = expression } [,...n ] 22. oldal Adatbázis-szerverek - összefoglaló

Az INTO cikkely szerepe már ismert, az eredménytáblát egy új adattáblában helyezi el. A FROM cikkely újdonsága a táblák illesztésének (kapcsolat) lehetősége (JOIN). Ennek előnye, hogy a feltételek nem terhelik a későbbi WHERE cikkelyt. A különféle illesztések (CROSS, INNER, OUTER) közül csak a leggyakrabban használt, ezért az alapértelmezett INNERt fogjuk használni. [ FROM { < forrás_tábla> } [,...n ] ] < forrás_tábla > ::= { tábla _név [ [ AS ] tábla _alias ] <illesztett_tábla> } < illesztett_tábla > ::= [ ( ] < forrás_tábla > JOIN < forrás_tábla > ON <kapcsolat_feltétel> [ ) ] Példa: join1.sql /* A személy, hallgató és szak táblák hagyományos illesztése */ USE vizsga SELECT név,szak.szak FROM szak,hallgató,személy WHERE hkód=személy.szkód AND hallgató.szak=szak.szkód -- ugyanez a JOIN lehetõségével SELECT név,szak.szak FROM személy JOIN hallgató ON hkód=szkód JOIN szak ON hallgató.szak=szak.szkód 23. oldal Adatbázis-szerverek - összefoglaló

A többi cikkely (WHERE, GROUP, HAVING, ORDER ) lehetőségeivel nem foglalkozunk. Tökéletesen elegendő számunkra a szabvány szerint jól begyakorolt technika. Feladat: Készítsen lekérdezéseket, amelyek szükségesek lehetnek az üzleti logika megvalósítása során! Vezérlőszerkezetek (procedurális nyelv) Ha az eddig tárgyalt utasításokat nem önmagukban, szingli parancsként szeretnénk végrehajtatni, hanem utasítások sorával tudjuk csak megfogalmazni a szükséges feladatot a nyelv procedurális egységeit kell használnunk. Erre különböző lehetőségeink vannak: Köteg (batch) T-SQL utasítások csoportja, amelyet a szerver egységként hajt végre Tárolt eljárás (stored procedure) T-SQL utasítások csoportja, amely az adatbázis része. A szerver előfordítja. Lehetőséget ad paraméterezésre, és eredményt produkál a kliens felé. Trigger Speciális tárolt eljárás, amely események bekövetkeztével hajtódik végre. Szkript T-SQL utasítások csoportja, amelyek egy fájlban tárolódnak. Kötegekből áll. A T-SQL ezek megvalósításához a következő elemeket biztosítja: 24. oldal Adatbázis-szerverek - összefoglaló

Válozók - A procedurális környezetben megszokott programelemek új típusokkal kiegészítve. A nyelv csak lokális változókat kezel. Vezérlőelemek A procedurális környezetben megszokott programelemek (szekvencia, szelekció, iteráció). Hibakezelés Egyszerűbb végrehajtási hibák kezelésére; ebben a fejezetben az ehhez rendelkezésre álló utasításokat veszszük sorra. DECLARE (lokális változó deklarálása) A T-SQL csak deklarált típusos lokális változókat kezel, melyeknek hatóköre az aktuális procedurális egység (köteg, függvény, eljárás, trigger). Értékadásban és SQL kifejezésben hivatkozhatunk rájuk. Deklarálhatjuk kezdőértékkel, ha nem tesszük, NULL értéket vesz fel. Lehetőség van tábla változó létrehozására is, ezen az érvényességi körben táblaműveleteket hajthatunk végre. DECLARE { @változó_név [AS] típus [ = value ] } [,...n] { @tábla_ változó_név [AS] <tábla_definíció> } < tábla_definíció > ::= TABLE ( { <oszlop_definíció> [<tábla_megszorítás>} [,... ] ) SET (skalárváltozó-értékadás) Skaláris változónak tudunk vele típusának megfelelő értéket adni. A kifejezés lehet egyértékű belső SELECT is. SET @változó_név = kifejezés Használható helyette a SELECT utasítás is (kevésbé ajánlott): 25. oldal Adatbázis-szerverek - összefoglaló

SELECT { @változó_név = kifejezés } [,...n ] Példa: változó1.sql /* deklarálunk, értéket adunk */ USE vizsga DECLARE @fõ INT DECLARE @n CHAR(2) ='FÕ' SET @fõ=(select COUNT(*) FROM hallgató) SELECT @fõ,@n BEGIN... END (szekvencia) T-SQL utasítások logikai egységbe (utasításblokk) foglalása. Szükséges, amikor szintaktikusan csupán egyetlen utasításnak van helye. Az utasításblokkok egymásba ágyazhatóak. BEGIN { sql_utasítás utasítás_blokk } END IF... ELSE (szelekció) A szokványos egy illetve kétágú szelekció. Amennyiben valamelyik ág több utasítást tartalmaz utasításblokként (BEGIN... END) kell megadni. Ha a feltétel SELECT-et tartalmaz, azt zárójelezni kell (belső select). IF logikai_kif 26. oldal Adatbázis-szerverek - összefoglaló

{ sql_utasítás utasítás_blokk } [ ELSE { sql_utasítás utasítás_blokk }] WHILE (iteráció) Az igazi (elöl tesztelős) ciklus. Sajnos tartalmazza a két fölösleges vezérlést (elhagyás, ismétlés). Amennyiben utasítást tartalmaz, utasításblokként (BEGIN... END) kell megadni. WHILE logikai_kif { sql_utasítás utasítás_blokk BREAK CONTINUE } TRY... CATCH (egyszerű hibacsapdázás) Amennyiben a TRY ágban végrehajtási hiba (pl. megszorítás sértés, program okozta megszakítás,...) lép fel, úgy a CATCH ág hajtódik végre. Ha nem volt hiba, akkor a CATCH nem kerül végrehajtásra. BEGIN TRY { sql_utasítás utasítás_blokk } END TRY BEGIN CATCH { sql_utasítás utasítás_blokk } END CATCH RAISERROR függvény (hiba generálás) Tetszőleges szövegű felhasználói hibaüzenet generálása és hibafeldolgozási tevékenység kezdeményezése. 27. oldal Adatbázis-szerverek - összefoglaló

Különböző szintű (0-10 üzenet, 11-18 hiba) hibaesemény előidézése, egy státuszértékkel (0-255) kiegészítve. Tízes szint fölött kiváltja a CATCH feltételt. RAISERROR ( { msg_str @lokális_változó } {,szint,státusz } ) PRINT (szöveges üzenet a kliensnek) Leginkább csak tesztelési lehetőség. Szöveges üzenet. PRINT @változó_név szöveg_kif Példa: vezérlőszerk.sql /* egy primitív péda a vezérlõ szerkezetek használatára */ DECLARE @n INT,@o INT SET @n=1 WHILE @n<100 BEGIN SET @o=1 WHILE @o<@n BEGIN SET @o=@o+1 IF @n%@o=0 BREAK END IF @o=@n PRINT @n SET @n=@n+1 END 28. oldal Adatbázis-szerverek - összefoglaló

Feladat: Készítsen szkripteket, amelyekben az előző feladatban megvalósított lekérdezések feltételében (WHERE) lokális változókra hivatkozik! Adatbázisban tárolt programelemek Procedurális program egységei. Végrehajtásukról az adatbázis-motor gondoskodik. Alkalmazásuk szükséges az üzleti logika programozásához, valamint az adatbiztonság és adatintegrációs épség biztosításához. Típusai: Függvény Adatbázis-szintű programelem; az egyéb környezetekben megszokott feladattal. Paraméterezhető, és visszatérési értéket produkál. Hivatkozása T-SQL-kifejezésben lehetséges. A formális aktuális paraméterek számának meg kell egyeznie. o Beépített a definiált T-SQL része o Felhasználói a felhasználó által definiált, nem tartalmazhat DDL és DML utasításokat Tárolt eljárás - Adatbázis szintű programelem. A függvény kiterjesztése. Hivatkozása T-SQL utasítással történik. o Rendszerbeli a definiált T-SQL része o Felhasználói a felhasználó által definiált, tartalmazhat (bizonyos) DDL és DML utasításokat Trigger (számunkra) adattábla-szintű programelem. Eljárásként működik, de hivatkozását adatbázisesemény váltja ki. 29. oldal Adatbázis-szerverek - összefoglaló

Beépített függvények A legkülönfélébb általános igényeket kielégítő gyűjtemény. Ide tartoznak a jól ismert aggregáló függvények, konverziós és adattípus függvények, metaadat-függvények, s így tovább... Tanulmányozásuk elengedhetetlen a fejlesztés során. (Megismerésükhöz javasolt az SSMS-ben a Databases->vizsga->Programmability->Functions- >System Functions mappa alapos vizsgálata a BOL-nal kiegészítve.) Hivatkozásuk sajnos eléggé zavaros: lehet hagyományos (SUBSTRING(...)), változó-szerű (@@ERROR), utasítás-szerű (CASE). Felhasználói függvények A felhasználó által definiált objektum. A DDL-ben megismert három utasítással (CREATE, ALTER, DROP) tartható karban, amelyeket általában szkriptként adunk meg. Tetszőleges T- SQL utasításokat tartalmazhat, kivéve az adattáblákra vonatkozó DDL és DML utasításokat. CREATE FUNCTION (felhasználóifüggvény-definiálás) Két típust különböztetünk meg, skalár- és tábla-értékűt a függvény értéke szerint. A tábla-értékű újabb két kategóriába sorolható: ún. inline (egysoros), illetve több-utasításos. Ennek megfelelően kissé változik a definíciós szintaktika. Skalár-értékű függvény (Mondhatjuk, hogy a hagyományos forma): CREATE FUNCTION függvény_név ( [ { @paraméter_név [ AS ] adat_típus 30. oldal Adatbázis-szerverek - összefoglaló

[ = default ] } [,...n ] ] ) RETURNS return_adat_típus BEGIN T-SQL_utasítás [ n] RETURN skalár_kifejezés END Példa: skalár_fv.sql /* technikailag célszerû az ALTER helyett is CREATE használata, mivel a szkript így mindíg az utolsó verziót tartalmazza. A megoldáshoz használjuk az "OBJECT_ID(objektum_név)" rendszer függvényt, amely az objektum azonosítóját eredményezi vagy üres értéket, ha az adott nevû objektum nem létezik */ USE vizsga IF OBJECT_ID ('szakon_hallgató') IS NOT NULL DROP FUNCTION szakon_hallgató /* célszerû a függvényrõl néhány információt a szkriptben elhelyezni */ -- adott szakon, [évfolyamon] nyilvántartott hallgatók száma -- szak : a szak kódja (kötelezõ) -- szemeszter : a szemeszter értéke, DEFAULT esetben összes CREATE FUNCTION szakon_hallgató( 31. oldal Adatbázis-szerverek - összefoglaló

@szak CHAR(3), @szemeszter TINYINT =NULL) RETURNS INT BEGIN DECLARE @fõ INT IF @szemeszter IS NULL SET @fõ=(select COUNT(*) FROM hallgató WHERE szak=@szak) ELSE SET @fõ=(select COUNT(*) FROM hallgató WHERE szak=@szak AND akt_szem=@szemeszter) RETURN @fõ END /* célszerû a tesztelést tartalmazó sorokat kommentként elhelyezni a szkriptbe */ --SELECT dbo.szakon_hallgató('mit',1) --SELECT dbo.szakon_hallgató('mit',default) In-line tábla-értékű függvény (Nem más, mint egy paraméterezett nézet): CREATE FUNCTION függvény_name ( [ { @paraméter_név [ AS ] adat_típus [ = default ] } [,...n ] ] ) RETURNS TABLE 32. oldal Adatbázis-szerverek - összefoglaló

RETURN [ ( ] select_utasítás [ ) ] Példa: in-line_fv.sql USE vizsga IF OBJECT_ID ('szakos_hallgatók') IS NOT NULL DROP FUNCTION szakos_hallgatók -- adott szakon és szemeszteren nyilvántartott hallgatók -- szak : a szak kódja -- szemeszter : a szemeszter értéke CREATE FUNCTION szakos_hallgatók(@szak CHAR(3), @szemeszter TINYINT) RETURNS TABLE RETURN (SELECT hkód,név FROM hallgató JOIN személy ON hkód=szkód WHERE szak=@szak AND akt_szem=@szemeszter) --SELECT * FROM dbo.szakos_hallgatók('mit',1) --SELECT * FROM dbo.szakos_hallgatók('mit',2) Multistatement táblaértékű függvény (A lokális táblá(k)ra használhatók a DML-utasítások): CREATE FUNCTION függvény_name ( [ { @paraméter_név [ AS ] adat_típus [ = default ] } [,...n ] 33. oldal Adatbázis-szerverek - összefoglaló

] ) RETURNS @return_változó TABLE <tábla_definíció> BEGIN T-SQL_utasítás [ n] RETURN END Példa: tábla_fv.sql /* a függvény alkalmazásához természetesen szükség van az összes táblára, megfelelõ mintasorokkal (ezt soha sem tudjuk megúszni!) */ USE vizsga IF OBJECT_ID ('nincs_jegye') IS NOT NULL DROP FUNCTION nincs_jegye -- adott hallgatónak(hkód) mely tárgyakból nincs még jegye -- h : hallgató kódja -- eredmény : tárgykódokat tartalmazó tábla CREATE FUNCTION nincs_jegye(@h INT) RETURNS @ered TABLE (t CHAR(4)) AS BEGIN DECLARE @szak CHAR(3) DECLARE @szem TINYINT 34. oldal Adatbázis-szerverek - összefoglaló

END -- SET helyett most célszerûbb a SELECT értékadásként SELECT @szak=szak,@szem=akt_szem FROM hallgató WHERE hkód=@h INSERT @ered SELECT t.tárgy FROM jelentkezés j JOIN vizsga v ON j.vizsga=v.vizsga AND j.hkód=@h AND jegy>1 RIGHT JOIN tematika t ON t.tárgy=v.tárgy AND t.szak=v.szak AND t.szak=@szak WHERE t.szak=@szak AND t.szemeszter<= @szem AND j.hkód IS NULL RETURN --SELECT * FROM dbo.nincs_jegye(3) -- --változtassuk a környezetet --UPDATE hallgató SET akt_szem=5 WHERE hkód=3 -- --változnia kell az eredménynek --SELECT * FROM dbo.nincs_jegye(3) Ezzel a technikával már sokkal komolyabb tábla megszorításokat (CHECK) tudunk definiálni, hiszen a logikai kifejezésben hivatkozhatunk felhasználói függvényekre is. Például a vizsgára jelentkezők száma nem haladhatja meg a maximális létszámot. 35. oldal Adatbázis-szerverek - összefoglaló

Példa: függvény_check1.sql USE vizsga -- adott vizsgára jelentkezett hallgatók száma -- v : vizsga azonosító -- eredmény : jelentezettek száma CREATE FUNCTION jelentkezett (@v INT) RETURNS SMALLINT BEGIN RETURN (SELECT COUNT(*) FROM jelentkezés WHERE vizsga=@v) END ALTER TABLE vizsga ADD CONSTRAINT CK_max_fõ CHECK (max_fõ>=dbo.jelentkezett(vizsga)) Teszteljük. Ne feledjük, hogy ez a megszorítás csak a max_fő oszlop változtatásánál fog érvénybe lépni. A hivatkozási épség megőrzéséhez az új jelentkezés üzleti logika megfogalmazásánál is lesz teendőnk. Másik példánkban a tematika megadásánál ellenőrizzük, hogy megfelelő előzmény tárgyat adtunk-e meg. Példa: függvény_check2.sql USE vizsga IF OBJECT_ID ('jó_elõzmény') IS NOT NULL DROP FUNCTION jó_elõzmény 36. oldal Adatbázis-szerverek - összefoglaló

-- létezõ elõzmény tárgy keresése -- szak : az új tematika szak -- elõzmény : az új tematika elõzmény tárgya -- szemeszter : az új tematika szemesztere -- eredmény : 1 megfelelõ, 0 nem CREATE FUNCTION jó_elõzmény (@szak CHAR(3),@elõzmény CHAR(4),@szemeszter TINYINT) RETURNS BIT BEGIN DECLARE @vk BIT =1 IF @elõzmény IS NOT NULL IF EXISTS (SELECT * FROM tematika WHERE szak=@szak AND tárgy=@elõzmény AND szemeszter<=@szemeszter) SET @vk=1 ELSE SET @vk=0 RETURN @vk END ALTER TABLE tematika ADD CONSTRAINT CK_tematika 37. oldal Adatbázis-szerverek - összefoglaló

CHECK (dbo.jó_elõzmény(szak,elõzmény,szemeszter)=1) -- teszteljük! Ne feledjük, hogy ez sem tökéletes megoldás, hiszen a rekurzív problémákat nem kezeli. Feladat: Tökéletesítse a példákban szereplő függvényeket, találjon ki újakat, amelyek hasznosak lehetnek az üzleti logika megvalósítása, és az adatintegritási feltételek megőrzése során! A rendszer tárolt eljárásai A legkülönfélébb speciális rendszerinformációk előállítását biztosítják. A felhasználói rendszer fejlesztésében (a mi szintünkön) nincs szükség rájuk, ezért jelen anyag nem foglalkozik velük (Kíváncsi érdeklődőknek javasolt az SSMS-ben a Databases->vizsga->Programmability->Stored Procedures->System Stored Procedures mappa vizsgálata, a BOL-nal kiegészítve.) Felhasználói tárolt eljárások A kliens-szerver-technika végrehajtási egységei. Az adatrétegbe integrált üzleti logika megvalósításának eszköze. Az egyéb fejlesztői környezetekben megszokott programozási egység. Paraméterezhető, paraméterei között szerepelhet output paraméter is. A kliens számára üzeneteket továbbíthat. 38. oldal Adatbázis-szerverek - összefoglaló

Tartalmazhatja a legtöbb T-SQL utasítást, beleértve a legtöbb DDLés a DML-utasításokat is. Lehetőség van újabb eljárás meghívására (32 szint), valamint egész típusú visszatérési kódot produkál (RETURN). Végrehajtása önálló utasítás (EXECUTE) segítségével történik. A formális aktuális paramétercsere lehet név szerinti és sorszám szerinti is. Utóbbi esetben a paraméterek számának meg kell egyeznie. Az eljárásokban definiált ideiglenes táblák láthatósága és élettartama a létrehozó eljárásra korlátozódik. CREATE PROCEDURE (tárolt eljárás definiálása) CREATE PROCEDURE procedúra_név [ { @paraméter_név adat_típus } [ = default ] [OUTPUT ] ] [,...n ] AS { T-SQL_utasítás [;][...n ] } EXECUTE (eljárás végrehajtása) { EXEC EXECUTE } { [ @return_státus = ] { eljárás_név } [ [ @paraméter = ] { kifejezés @változó [ OUTPUT ] [ DEFAULT ] } ] [,...n ] 39. oldal Adatbázis-szerverek - összefoglaló

Példa: proc1.sql /* rendszerünkben az új hallgató felvétele két táblában is tevékenységet igényel. Új sor a személy-ben és a hallgatóban. Természetesen az üzleti logika alapján ez egyetlen tevékenység. A megoldást a tárolt eljárás jelenti */ USE vizsga IF OBJECT_ID ('új_hallgató') IS NOT NULL DROP PROC új_hallgató CREATE PROCEDURE új_hallgató @név VARCHAR(50), @szül SMALLDATETIME, @szak CHAR(3), @újkód INT OUTPUT AS DECLARE @vk int =0 --visszatérési érték INSERT személy VALUES(@név,@szül) /* IDENT_CURRENT rendszerfüggvény adott tábla aktuális azonosítóját addja értékül */ SET @újkód=ident_current('személy') INSERT hallgató (hkód,szak) VALUES(@újkód,@szak) 40. oldal Adatbázis-szerverek - összefoglaló

RETURN @vk /* DECLARE @ukód INT DECLARE @rc INT EXECUTE @rc=új_hallgató 'Új Ede','1980.01.02','MIT',@ukód OUTPUT SELECT @ukód,@rc */ Ugyanez primitív hibakezeléssel. A visszatérési kódot használhatjuk hibajelzésre. TRY CATCH-szerkezet segítségével csapdázzuk a hibaesetet, a @@ERROR rendszerfüggvény adja az utolsó utasítás által kiváltott hiba kódját. (Hibaüzenetek a sys.messages rendszernézetben.) Példa: proc_try.sql /* rendszerünkben az új hallgató felvétele két táblában is tevékenységet igényel. Új sor a személy-ben és a hallgatóban. Természetesen az üzleti logika alapján ez egyetlen tevékenység. A megoldást a tárolt eljárás jelenti. */ USE vizsga IF OBJECT_ID ('új_hallgató') IS NOT NULL DROP PROC új_hallgató CREATE PROCEDURE új_hallgató 41. oldal Adatbázis-szerverek - összefoglaló

AS @név VARCHAR(50), @szül SMALLDATETIME, @szak CHAR(3), @újkód INT OUTPUT DECLARE @hiba int =0 --hibátlan működés BEGIN TRY INSERT személy VALUES(@név,@szül) SET @újkód=ident_current('személy') INSERT hallgató (hkód,szak) VALUES(@újkód,@szak) END TRY BEGIN CATCH SET @hiba=@@error END CATCH RETURN @hiba /* DECLARE @ukód INT DECLARE @rc INT EXECUTE @rc=új_hallgató 'Új Ede','1980.01.02','MaT',@ukód OUTPUT SELECT @ukód AS Új_hallgató_kód,@rc AS hibakód */ Feladat: 42. oldal Adatbázis-szerverek - összefoglaló

Tökéletesítse a példákban szereplő eljárásokat, próbálkozzon egyszerűbb üzleti logikai elemek (funkciók) megvalósításával! (Gondoljon arra, mire lesz szüksége a felhasználói felületen.) DML-triggerek Speciális tárolt eljárások tábla-hatókörben. Nem paraméterezhetőek, végrehajtásuk automatikusan DML-utasítások hatására történik. Hasznosak az üzleti logika programozásában, valamint a hivatkozási épség biztosításában. Végrehajtásuk során az aktuális adatmódosítás előtti (DELETED tábla) és utáni (INSERTED tábla) értékekre hivatkozhatunk. A végrehajtott módosítások helyett (INSTEAD OF), vagy után (AFTER) hajtódnak végre. Mivel a DML-utasítások tranzakcióként hajtódnak végre, lehetőséget biztosítanak akár a tranzakció visszagörgetésére is. CREATE TRIGGER (DML trigger definiálása) CREATE TRIGGER trigger_név ON tábla_név { AFTER INSTEAD OF } { [ INSERT ] [, ] [ UPDATE ] [, ] [ DELETE ] } AS { T-SQL_utasítás [ ; ] [,...n ] } Tipikus alkalmazása lehet, amikor a default értéket nem tudjuk konstansként megadni. Rendszerünkben például a vizsgára való jelentkezésnél a hallgató aktuális szemeszterét. Példa: trigger_default.sql USE vizsga IF OBJECT_ID ('új_jelentkezés') IS NOT NULL DROP TRIGGER új_jelentkezés 43. oldal Adatbázis-szerverek - összefoglaló

/* DEFAULT-al nem kezelhető, ezért az aktuális szemesztert TRIGGERREL adjuk meg */ CREATE TRIGGER új_jelentkezés ON jelentkezés AFTER INSERT AS UPDATE jelentkezés SET szem=(select akt_szem FROM hallgató WHERE hallgató.hkód=j.hkód) FROM inserted i JOIN jelentkezés j ON j.hkód=i.hkód AND j.vizsga=i.vizsga /* -- teszt: -- egyetlen INSERT INSERT jelentkezés (hkód,vizsga) VALUES(1,2) SELECT * FROM hallgató WHERE hkód=1 SELECT * from jelentkezés WHERE hkód=1 AND vizsga=2 -- több INSERT 44. oldal Adatbázis-szerverek - összefoglaló

INSERT jelentkezés (hkód,vizsga) SELECT hkód,2 FROM hallgató WHERE szak='min' AND akt_szem=1 SELECT * from jelentkezés WHERE vizsga=2 */ Másik tipikus alkalmazás a nalpózás. Tároljuk, ki, mikor mit változtatott az adattábla tartalmán. Példaalkalmazásunkban ilyen a jelentkezés (jegy) változtatása. Példa: trigger_napló.sql USE vizsga IF OBJECT_ID ('jelentkezés_napló') IS NOT NULL DROP TRIGGER jelentkezés_napló -- "naplózzuk" a jelentkezésekben a jegy változását -- kell egy napló tábla: IF OBJECT_ID ('vizsga_napló') IS NOT NULL DROP TABLE vizsga_napló CREATE TABLE vizsga_napló( hkód INT NULL, vizsga INT NULL, régi TINYINT NULL, 45. oldal Adatbázis-szerverek - összefoglaló

új TINYINT NULL, idő DATETIME NOT NULL CONSTRAINT DF_vizsga_napló_idő DEFAULT (GETDATE()), -- aktuális idő user_név NVARCHAR(50) NOT NULL CONSTRAINT DF_vizsga_napló_user_név DEFAULT (SUSER_NAME()), -- aktuális user azon INT IDENTITY(1,1) NOT NULL CONSTRAINT PK_vizsga_napló PRIMARY KEY ) -- és kell egy TRIGGER CREATE TRIGGER jelentkezés_napló ON jelentkezés AFTER INSERT,DELETE,UPDATE AS DECLARE @hkód int, @vizsga int, @régi tinyint, @új tinyint IF EXISTS (SELECT * FROM inserted) SELECT @hkód=i.hkód,@vizsga=i.vizsga,@új=i.jegy FROM inserted i IF EXISTS (SELECT * FROM deleted) SELECT @hkód=d.hkód,@vizsga=d.vizsga, @régi=d.jegy FROM deleted d IF @régi IS NULL OR @új IS NULL OR @régi<>@új 46. oldal Adatbázis-szerverek - összefoglaló

Feladat: INSERT vizsga_napló (hkód,vizsga,régi,új) VALUES (@hkód,@vizsga,@régi,@új) A példában szereplő trigger csak egyetlen műveletre működik, csoportos jelentkezés, törlés esetén nem működik. JAVÍTSA!!! Tranzakciókezelés Előfordul (igen gyakran), hogy bizonyos utasításokat egységként kell végrehajtani (vagy az összeset, vagy egyiket sem). A megoldást a tranzakciókezelés nyújtja. A tranzakció során az adatmódosítások tulajdonképpen logikai szinten hajtódnak végre. A fizikai megvalósítás a tranzakció elfogadásakor történik. A tranzakciókezelés gondoskodik az erőforrások kezeléséről. Ne feledjük, hogy minden DML-utasítás tranzakcióként hajtódik végre (implicit tranzakció). A fejlesztő által indított tranzakciókat nevezzük explicitnek. A tranzakciók egymásba ágyazhatóak, a szintek követéséhez a rendszer a @@TRANCOUNT változót használja. BEGIN TRASACTION (tranzakció indítása) BEGIN { TRAN TRANSACTION } Új tranzakciós szint indítása. @@TRANCOUNT inkrementálódik. DML-utasítás hatására ugyanez történik (implicit tranzakció). 47. oldal Adatbázis-szerverek - összefoglaló

COMMIT TRANSACTION (tranzakció elfogadtatása) COMMIT { TRAN TRANSACTION } A tranzakciós szintet (@@TRANCOUNT) csökkenti. Amennyiben elérte a 0. szintet, az adatmódosítások fizikai szinten megtörténnek, a lekötött erőforrások felszabadulnak. Nullás szinten kiadott COMMIT hibát eredményez. ROLLBACK TRANSACTION (tranzakció visszagörgetése) Minden logikai adatmódosítást elenged a legfelsőbb tranzakciós szintig, fizikai módosítás nem történik. @@TRANCOUNT értékét 0-ra állítja, az erőforrásokat felszabadítja. DML-triggerben kiadott ROLL- BACK hatása ugyanez. A ROLLBACK hatására hibaesemény nem következik be. Példa: sp_ujhallg_tr.sql /* az új hallgató eljárás korrekt hibakezeléssel */ USE vizsga IF OBJECT_ID ('új_hallgató') IS NOT NULL DROP PROC új_hallgató CREATE PROCEDURE új_hallgató @nev VARCHAR(50), @szül SMALLDATETIME, @szak CHAR(3), @újkód INT OUTPUT 48. oldal Adatbázis-szerverek - összefoglaló

AS DECLARE @rc int BEGIN TRANSACTION BEGIN TRY INSERT személy VALUES(@nev,@szül) SET @újkód=ident_current('személy') INSERT hallgató (hkód,szak) VALUES(@újkód,@szak) COMMIT TRANSACTION END TRY BEGIN CATCH SET @rc=@@error ROLLBACK TRANSACTION END CATCH RETURN @rc --END -- teszt /* DECLARE @ukód INT DECLARE @rc INT EXEC @rc=új_hallgató 'Új Ede','1980.01.02','MiT',@ukód OUTPUT SELECT @ukód,@rc go 49. oldal Adatbázis-szerverek - összefoglaló

SELECT TOP 3 * FROM személy ORDER BY 1 DESC SELECT TOP 3 * FROM hallgató ORDER BY 1 DESC -- próbáljuk meg hibákkal! */ Másik példánkban megszorítás kezelésre használunk triggerben alkalmazott ROLLBACK-et. (Nagyon csúnya megoldás, de működik.) Példa: tranzakció_trigger.sql USE vizsga CREATE TRIGGER létszám ON jelentkezés AFTER insert AS IF (SELECT COUNT(*) FROM jelentkezés j JOIN inserted i ON j.vizsga=i.vizsga) >(SELECT max_fõ FROM vizsga v JOIN inserted i ON v.vizsga=i.vizsga) ROLLBACK TRANSACTION Feladat: Próbálgassa a lehetőségeket mind az adatmodell mind pedig az üzleti modell megvalósításhoz szükséges elemekként. Készítse el a vizsga feladatok megoldásait. 50. oldal Adatbázis-szerverek - összefoglaló