Näkymät ja hakemistot A271117, Tietokannat Teemu Saarelainen teemu.saarelainen@kyamk.fi Lähteet: Leon Atkinson: core MySQL Ari Hovi: SQL-opas TTY:n tietokantojen perusteet-kurssin opintomoniste Eri web-lähteet Näkymä (View) Näkymä on talletettu kysely Eräänlainen virtuaalinen taulu Helpottaa usein tehtyjen kyselyjen tekoa Ei tarvitse muistaa pitkiä kyselylausekkeita Toimivat turvallisuusmekanismina Muutetaan tiedon esitysmuotoa Luodaan "raportteja" (koostettua tietoa) Karsitaan näytettäviä sarakkeita tai rivejä 1
SQL: Näkymän luonti Syntaksi: CREATE VIEW <nimi> AS <SQL-SELECT-lause>; CREATE VIEW TI08 AS SELECT Etunimi, Sukunimi, Opintopisteet FROM Opiskelijat WHERE Ryhma = TI08 ; SQL: Näkymä Näkymää voi tämän jälkeen käyttää, kuten tavallista taulua Rajoitteita ja ehtoja voi myös lisätä Syntaksi: SELECT * FROM <view>; SELECT * FROM TI08; SELECT * FROM TI08 WHERE Opintopisteet < 80; (Huom. MySQL:ssä näkymät tulivat mukaan v. 5.01:ssä) 2
Taulun muuttaminen näkymän avulla Taulun tietoja voi myös muuttaa näkymästä Voidaan tehdä lisäyksiä, poistoja sekä muutoksia Edellyttää, että tietyt ehdot täyttyvät Näkymää voidaan päivittää, jos Näkymän muodostuksessa ei ole käytetty DISTINCT määrettä tai koosteoperaattoreita WHERE-osassa ei ole R:ään kohdistuvaa alikyselyä SELECT-osassa on riittävästi ominaisuuksia (vähintään pääavaimet ja NOT NULL-sarakkeet) Taulun muuttaminen näkymän avulla INSERT INTO TI08 VALUES( Into, Insinööri,240); Edellinen lisäys tehdään oikeasti Opiskelija-relaatioon Opiskelija_ID Etunimi Sukunimi Osoite Puhelinnro Opintopisteet Entä ominaisuudet, jotka eivät ole mukana näkymässä? Näiden arvoksi tulee NULL 3
Indeksi eli hakemisto (Index) Relaation kaikkien kenttien perusteella voi tehdä hakuja Hakunopeus voi kuitenkin vaihdella suuresti Indeksien tarkoituksena on varmistaa yksilöivyys nopeuttaa hakuja estää lajitteluja Indeksi eli hakemisto (Index) Taulusta erillinen tietojoukko Indeksien avulla pyritään siis tehostamaan monikoiden hakemista tauluista Voidaan luoda vain perusrelaatioille Käytetään automaattisesti (päättely WHERE ja/tai ORDER BY osissa olevien ominaisuuksien perusteella) Yksittäinen indeksi ei nopeuta kaikkia hakuja Suunnitellaan erikseen kunkin tyyppisille hauille Muodostetaan indeksiin valittujen ominaisuuksien arvoista ja niitä vastaavien rivien tietueosoitteista Ominaisuuksien järjestyksellä on indeksin määrittelyssä väliä! Sisältää viitteet varsinaisiin tauluissa oleviin monikoihin 4
Indeksi eli hakemisto (Index) Perusavaimen perusteella tehdään aina indeksi Viiteavaimet voidaan indeksoida, jotta viittaukset taulujen välillä olisivat nopeita Myös tärkeät ja usein käytetyt hakutermit kannattaa yleensä indeksoida Taulujen indeksointi vaikuttaa ainoastaan suorituskykyyn ei hakujen logiikkaan Indeksit voivat myös haitata vievät levytilaa, hidastavat päivityksiä (indeksitkin pitää päivittää) Indeksit pyritään pitämään keskusmuistissa SQL Indeksi Indeksin perustaminen: CREATE INDEX <indeksin_nimi> ON <taulu>(<ominaisuudet>); CREATE INDEX opiskelija_nimi ON Opiskelija(Sukunimi, Etunimi); Indeksin poistaminen: DROP INDEX <indeksin_nimi>; DROP INDEX opiskelija_nimi; 5
Indeksointiohjeita Mitä kannattaa (yleensä) indeksoida: useasti liitoksissa käytettävät sarakkeet (erityisesti pää ja vierasavaimet, jos tkhj ei hoida automaattisesti) useasti WHERE ja ORDER BY osissa olevat sarakkeet sarakkeet & sarakeyhdistelmät joissa on vain vähän samoja arvoja älä indeksoi (rivimäärältään) pieniä relaatioita Muista ominaisuuksien järjestys indeksissä: yhtä ominaisuutta käytetään usein hakemistossa ensimmäiseksi tiettyä ominaisuusyhdistelmää käytetään usein mahdollisesti useita hakemistoja ja kaikkein valikoivin ominaisuus ensimmäiseksi Tietokannan käyttöoikeudet Tietokannan käyttöä voidaan rajata käyttäjillä valtuuksilla näkymillä Näkymillä voidaan rajata, kuka pääsee mihinkin osaan relaatiosta kiinni (riveihin tai sarakkeisiin) Käyttäjille voidaan antaa erilaisia käyttöoikeuksia eli valtuuksia taulu- tai näkymäkohtaisesti Jos perustauluja käsitellään näkymien kautta voidaan varmistua siitä, että kukin käyttäjä pystyy käsittelemään vain niitä tietoja joita hänen kuuluukin pystyy tekemään tiedoille vain sallitut operaatiot 6
Tietokannan käyttäjätunnukset Tietokantaan on (yleensä) erilliset käyttäjätunnukset ei mitään tekemistä alla olevan käyttöjärjestelmän käyttäjätunnusten kanssa (vrt. kurssin db-palvelin) tietokannalle luodaan omat käyttäjätunnukset (ja yleensä näihin liittyvät salasanat) Käyttäjätunnuksen luonti SQL:ssä CREATE USER <user_id> IDENTIFIED BY <password>; Tietokannan käyttöoikeudet Tietokantayhteyttä avattaessa käyttäjä tunnistetaan kysytään käyttäjätunnus ja salasana Nämä voidaan antaa myös yhteydenottopyynnön parametreina (vrt. esim. php: mysqli_connect()) Tauluille ja näkymille voidaan antaa käyttäjäkohtaisia valtuuksia Oikeustasoja SELECT - Oikeus hakea tietoa INSERT (sarake) - Oikeus lisätä rivejä, voidaan määrittää sarakekohtaisesti UPDATE (sarake) - Oikeus päivittää tietoa, voidaan määrittää sarakekohtaisesti DELETE - Oikeus poistaa tietoa REFERENCES (sarake) - Oikeus käyttää taulua (tai sen saraketta) viitteissä ALL 7
Valtuuksien myöntäminen Valtuuksia voidaan myöntää SQL:ssä komennolla GRANT: GRANT { <priviledge> ALL PRIVILEGES } ON <table view)> TO { <user> PUBLIC } [ WITH GRANT OPTION ]; GRANT SELECT ON TI08 TO katselija; 8