Adatbázisok 5. előadás Tikk Domonkos
Mai menü Integritási megszorítások SQL ER-modell Data Control Language
Integritási megszorítások
Integritási megszorítások – integrity constraints (ICs) IC: olyan feltételek, amelyeknek minden adatbázisba kerülő rekordnak eleget kell tennie, pl. értékkészlet megszorítások. Séma definíciójakor adjuk meg Ellenőrzésre kerülnek a reláció módosulásakor Azok a legális rekordok, amelyek minden megszorítást teljesítenek DBMS-be nem kerülhetnek bele illegális rekordok DBMS felügyeli a megszorításokat: megakadályozza az illegális adatok bekerülését Az adatok tükrözik a tervező célját A valós világot hűen reprezentálják Hibás adatok beszúrása elkerülhető 5
Emlékeztető Elsődleges kulcs (PRIMARY KEY) Egyedi kulcs (UNIQUE) Idegen kulcs (FOREIGN KEY) Ellenőrzés értéktartományra (CHECK, [NOT] NULL ]) 6
Megszorítások: feladat Milyen idegen kulcs megszorítást célszerű tenni az EMP és a DEPT táblák között? Milyen más megszorítást érdemes tenni az EMP táblában?
EMP tábla – megszorítások nélkül CREATE TABLE emp ( empno NUMBER(4), ename VARCHAR2(10), job VARCHAR2(9), mgr NUMBER(4), HIREDATE DATE, SAL NUMBER(7,2), COMM NUMBER (7,2), DEPTNO NUMBER(2) );
EMP tábla – elsődleges megszorítások CREATE TABLE emp ( empno NUMBER(4) NOT NULL, ename VARCHAR2(10), job VARCHAR2(9), mgr NUMBER(4), HIREDATE DATE, SAL NUMBER(7,2), COMM NUMBER (7,2), DEPTNO NUMBER(2) );
Példa idegen kulcsra (2) Csak olyan részlegazonosítóra hivatkozhatunk az EMP táblában, amely létezik már a DEPT táblában CREATE TABLE EMP (empno NUMBER(4) NOT NULL, ENAME VARCHAR2(10), …. DEPTNO NUMBER(2) NOT NULL, PRIMARY KEY (empno), FOREIGN KEY (deptno) REFERENCES DEPT (deptno)); EMP DEPT empno ename … deptno 7369 SMITH 20 7499 ALLEN 30 7844 TURNER deptno dname loc 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 7
EMP tábla – eddigi megszorítások CREATE TABLE emp ( empno NUMBER(4) NOT NULL, ename VARCHAR2(10), job VARCHAR2(9), mgr NUMBER(4), HIREDATE DATE, SAL NUMBER(7,2), COMM NUMBER (7,2), DEPTNO NUMBER(2) NOT NULL CONSTRAINT emp_prim_key PRIMARY KEY (empno), CONSTRAINT emp_frgn_key FOREIGN KEY (deptno) REFERENCES DEPT (deptno) );
EMP tábla – belső megszorítás CREATE TABLE emp ( empno NUMBER(4) NOT NULL, ename VARCHAR2(10), job VARCHAR2(9), mgr NUMBER(4) CONSTRAINT emp_self_key REFERENCES EMP (empno) HIREDATE DATE, SAL NUMBER(7,2), COMM NUMBER (7,2), DEPTNO NUMBER(2) NOT NULL CONSTRAINT emp_prim_key PRIMARY KEY (empno), CONSTRAINT emp_frgn_key FOREIGN KEY (deptno) REFERENCES DEPT (deptno) );
Megszorítások kiitatása/beállítása DELETE FROM emp WHERE UPPER(ename)=’BLAKE’; Hibát ad: integritás megszorítás (TURNER.emp_self_key) megsértés Ok: TURNER főnöke BLAKE, nem lehet törölni, mert akkor a hivatkozás is elvész ALTER TABLE emp DISABLE CONSTRAINT emp_self_key; ENABLE CONSTRAINT emp_self_key; Adattábla integritása sérül – jobb egy másik főnök alá tenni BLAKE összes beosztottját előtte
NULL érték Az attribútumok értéke egyes rekordokban lehet ismeretlen (pl. még nem adtak meg belépési dátumot), vagy nem definiált (pl. nincs jutalék az adott beosztásban) Erre szolgál a speciális NULL érték SQL-ben Számos komplikációt okoz: Külön operátorok szükségesek a NULL érték ellenőrzésére (IS NULL/IS NOT NULL) Hogyan értékeljük ki a comm>0-t, ha comm is NULL Mi történik a logikai operátorokkal (AND, OR, NOT)? 3-értékű logikát kell definiálni (T, F, U)
Háromértékű logika T AND T; T AND F; T OR F; F OR F; T AND U = F AND U = U AND U = T OR U = F OR U = U OR U = Nem triviális, és SQL sem teljesen konzisztens
SQL: Kleene-féle háromértékű logika A OR B B True Unknown False A A NOT A True False Unknown A AND B B True Unknown False A NULL-lal való hasonlítás értéke általában NULL kivéve UNION és INTERSECT implementálásában
További következmények Jól át kell gondolni a WHERE feltételeket, mivel kiszedi a nem True értékű rekordokat Új operátorok: outer joins, ill. (+)
Ellenőrzések (CHECK) Célja, hogy kiszűrje az illegális adatok bekerülését az adatbázisba Életkor nem lehet 150 felett jegyátlag nem lehet 5.0 felett Hasznos, amikor bonyolultabb megszorítások vannak, mint amit kulcsokkal ki lehet fejezni Csak akkor állnak fent, ha a tábla nem üres Elnevezhetők
Példa (1) CREATE TABLE Sailors AND rating <= 10 ) ( sid INTEGER, sname CHAR(10), rating INTEGER, age REAL, PRIMARY KEY (sid), CHECK ( rating >= 1 AND rating <= 10 )
Példa (2) – elnevezéssel CREATE TABLE Reserves ( sname CHAR(10), bid INTEGER, day DATE, PRIMARY KEY (bid,day), CONSTRAINT noInterlakeRes CHECK (`Interlake’ <> ( SELECT B.bname FROM Boats B WHERE B.bid=bid)))
Példa (3) – több táblás Cél: hajók és a tengerészek száma ne érhesse el a 100-at Ez jó? CREATE TABLE Sailors ( sid INTEGER, sname CHAR(10), rating INTEGER, age REAL, PRIMARY KEY (sid), CHECK ( (SELECT COUNT (S.sid) FROM Sailors S) + (SELECT COUNT (B.bid) FROM Boats B) < 100)
A helyes megoldás: ASSERTION Nem táblához kötött CREATE ASSERTION smallClub CHECK ( (SELECT COUNT (S.sid) FROM Sailors S) + (SELECT COUNT (B.bid) FROM Boats B) < 100)
Mi határozza meg az integritási megszorításokat (IC)? A modellezett vállalat „szemantikája”, amit a relációs adatbázissal modellezünk Ellenőrizhető, hogy egy adatbázis megfelel-e egy IC-nek, de sohasem állíthatjuk, hogy egy IC igaz egy adatbázisra Mivel az IC állítása az összes lehetséges rekordra vonatkozik Például azt tudjuk, hogy az ename nem kulcs, de azt hogy az empno kulcs azt csak ellenőrizni tudjuk Elsődleges és idegen kulcsokat gyakran használunk, a többi IC-t ritkábban
Táblák létrehozása ER-modell alapján DB logikai rétegének létrehozása
Egyedhalmaz létrehozása CREATE TABLE Employees (ssn CHAR(11), name CHAR(20), lot INTEGER, PRIMARY KEY (ssn)) Employees ssn name lot
Kapcsolathalmaz létrehozása Mire kell figyelni a reláció létrehozásánál? minden egyedhalmaz kulcsa legyen benne (idegen kulcs) ezek összessége itt szuperkulcs lesz Minden leíró attribútum kapcsolása CREATE TABLE Works_In( ssn CHAR(11), did INTEGER, since DATE, PRIMARY KEY (ssn, did), FOREIGN KEY (ssn) REFERENCES Employees, FOREIGN KEY (did) REFERENCES Departments)
Feladat Adjuk meg a Works_In2 relációt az alábbi ER- diagram alapján!
Kulcsattribútum és kapcsolattípus figyelembevétele Hogyan vesszük figyelembe a kapcsolat aritását az integritási megszorítások megadásánál? Mi lesz a kulcsa a Manages relációnak és miért?
Megoldások Már nem ssn a kulcs, hanem did Elválasztja a 2 táblát egymástól Kombinálhatjuk is a két táblát, mivel minden osztálynak külön menedzsere van CREATE TABLE Manages( ssn CHAR(11), did INTEGER, since DATE, PRIMARY KEY (did), FOREIGN KEY (ssn) REFERENCES Employees, FOREIGN KEY (did) REFERENCES Departments) CREATE TABLE Dept_Mgr( did INTEGER, dname CHAR(20), budget REAL, ssn CHAR(11), since DATE, PRIMARY KEY (did), FOREIGN KEY (ssn) REFERENCES Employees)
Emlékeztető: participation constraint Van-e minden osztálynak főnöke? Hivatkozási megszorítás (participation constraint): az egyedhalmaz minden elemének szerepelnie kell a relációnak legalább egy példányában félkövér v. dupla vonallal jelöljük
Participation constraint SQL-ben Néhány tulajdonságot kódolhatunk, de viszonylag kicsiny a mozgástér (CHECK használata nélkül) CREATE TABLE Dept_Mgr( did INTEGER, dname CHAR(20), budget REAL, ssn CHAR(11) NOT NULL, since DATE, PRIMARY KEY (did), FOREIGN KEY (ssn) REFERENCES Employees, ON DELETE NO ACTION)
Gyenge egyedhalmazok Az egyedhalmaz attribútumai nem elégségesek az egyedek azonosítására, és más egyedhalmazok kulcsa is kell ehhez Jelölés: dupla vagy vastag vonal az egyedhalmazra és a kapcsolatra is A gyenge egyedhalmaz minden elemének szerepelnie kell a másik egyedhalmazban!
Gyenge egyedhalmazok átírása A gyenge egyedhalmaz és az azonosító kapcsolathalmazokat egy relációba kódoljuk Az „erős” egyed törlésekor a gyenge egyed törlendő CREATE TABLE Szerződések ( Fizetés INTEGER, Sznév CHAR(11) NOT NULL, Snév CHAR(11) NOT NULL, Cím CHAR(20) NOT NULL, Év INTEGER NOT NULL, PRIMARY KEY (Sznév, Snév, Cím, Év), FOREIGN KEY (Sznév) REFERENCES Színészek, ON DELETE NO ACTION, FOREIGN KEY (Snév) REFERENCES Stúdiók, ON DELETE CASCADE, FOREIGN KEY (Cím,Év) REFERENCES Filmek, ON DELETE NO ACTION)
ISA-hierarchiák Tervezési kérdések: átfedés megengedett? Hourly_Emps ∩ Contract_Emps≠∅ lefedés teljesül? Hourly_Emps ∪ Contract_Emps = Employees
ISA-hierarchiák átírása (1) Általános megoldás 3 reláció: Employees, Hourly_Emps, Contract_Emps Hourly_Emps: minden egyed benne van az Employee táblában is, de kiegészítő infók ebben a táblában Hourly_Emps (hourly_wages, hours_worked, ssn) ON DELETE CASCADE Dolgozók könnyen lekérdezhetők általánosan Órabéres dolgozók speciális attribútumai esetén join-ra van szükség
ISA-hierarchiák átírása (2) Alternatív megoldás Csak 2 reláció: Hourly_Emps, Contract_Emps Hourly_Emps: minden egyed benne van az Employee táblában is, de kiegészítő infók ebben a táblában Hourly_Emps (ssn, name, lot, hourly_wages, hours_worked) Contract_Emps (ssn, name, lot, contractid) Minden dolgozót a két tábla valamelyikében tároljuk Dolgozók a két tábla uniójából lekérdezhetők csak le
DCL – Data Control Language
DCL – Data Control Language Tranzakciókezelés COMMIT ROLLBACK LOCK UNLOCK Jogosítványkezelés GRANT … with GRANT options REVOKE
Tranzakciókezelés Egységként kezelt utasítássorozat adatbázis-konzisztencia megőrzése céljából Alaphelyzet – utasításszintű konzisztencia Ha tranzakciószinten szeretnénk, akkor ezt máshogy érhetjük el BEGIN WORK – kezdőpont COMMIT – végpont/jóváhagyás ROLLBACK – érvénytelenítés/visszagörgetés
Mentési pont SAVEPOINT – erre lehet hivatkozni a visszagörgetésnél SAVEPOINT mentesi_pont_neve ROLLBACK – visszagörget tranzakció elejéig (default) mentési pontig ( … TO SAVEPOINT nev) implicite feloldja a táblazárolásokat
Tranzakció – példa START TRANSACTION; -- Függ a DBMS-től UPDATE Account SET amount=amount-200 WHERE account_number=1234; UPDATE Account SET amount=amount+200 WHERE account_number=2345; IF ERRORS=0 COMMIT; IF ERRORS<>0 ROLLBACK;
Visszagörgetés COMMIT; SAVEPOINT A1; SAVEPOINT A2; ROLLBACK TO A2; – A2-ig való visszagörgetés ROLLBACK TO A1; – A1-ig való visszagörgetés, A2 mentési pont törlése és zárak (LOCK) törlése ROLLBACK; – visszagörgetés COMMIT-ig és minden mentési pont törlése, zárak feloldása
Felhasználókezelés CREATE USER DROP USER CREATE USER hallgato IDENTIFIED BY pwd; ilyenkor még nincsen semmilyen joga a hallgato-nak ALTER USER hallgato IDENTIFIED BY pwd2; DROP USER hallgato;
Jogosultságkezelés GRANT jogok ON adatbázisnév[, táblanév] TO username@host IDENTIFIED BY pwd WITH GRANT OPTION;
Rendszerjogosultságok CREATE SESSION – kapcsolódás adatbázishoz CREATE TABLE – táblalétrehozási jog CREATE VIEW – nézettábla létrehozási jog CREATE PROCEDURE – függvénylétrehozási jog GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW TO hallgato; Belépés: CONNECT hallgato/pwd2;
Szerepkör Ahelyett hogy egyesével adnánk jogokat, szerepköröket definiálhatunk CREATE ROLE szerepkör_neve GRANT CREATE TABLE, CREATE SESSION TO szerepkör_neve GRANT szerepkör_neve TO user1, user2, user3
Objektumkezelési jogosultságok ALTER DELETE EXECUTE INDEX REFERENCES SELECT UPDATE
Példák GRANT SELECT on Students TO hallgato; GRANT ALL on Students TO hallgato; GRANT SELECT on Students TO PUBLIC; GRANT SELECT on Students TO hallgato_szerepkor; GRANT SELECT on Students TO hallgato WITH GRANT OPTION;
Jogok visszavonása REVOKE jogok [,WITH GRANT OPTION] ON adatbázisnév[, táblanév] FROM felh@host | szerepkör | PUBLIC
QUERY Language Egyetlen utasítás: SELECT SELECT [DISTINCT] oszlopnevek FROM táblanevek [WHERE feltétel] [GROUP BY feltétel [HAVING having-feltétel]] [ORDER BY rendezési-feltétel]
Beágyazott lekérdezések WHERE utasításon belül is alkalmazhatók SELECT utasítások [NOT] IN (selectkifejezés) Θ[ANY|ALL] (selectkifejezés) [NOT] EXISTS (selectkifejezés) A kiszámítási kiértékelése belülről kezdődik
Példa ANY-re Listázzuk ki azon dolgozókat, akik fizetése kisebb mint valamelyik részlegátlag SELECT ename, sal FROM EMP WHERE sal < ANY (SELECT avg(sal) FROM EMP GROUP by deptno);
Példa ALL-ra Listázzuk ki azon dolgozókat, akik fizetése kisebb mint valamennyi részlegátlag SELECT ename, sal FROM EMP WHERE sal < ALL (SELECT avg(sal) FROM EMP GROUP by deptno);