HELIA 1 (15) Luento 2.7 Toiminnallisuutta tietokantaan... 2 Deklaratiivinen eheysvalvonta... 2 Proseduraalinen eheysvalvonta... 3 Eheysvalvonnan suunnittelusta... 4 Sääntöjen määrittely... 4 Toteutusvaihtoehdot... 6 Herätetoiminnot - Triggerit / Aktiiviset säännöt... 8 Määrittely... 8 SQL3:n syntaksi... 9 Oracle 7 8:n syntaksi... 10 Suoritus ja käyttöoikeudet... 12 Käyttötilanteita... 13 Muita käyttökohteita... 14 Tietoturva... 14 Replikointi on-line... 14 Suorituskyvyn parantaminen... 14 SQL3:n Assertiot... 15
HELIA 2 (15) Toiminnallisuutta tietokantaan Deklaratiivinen eheysvalvonta Osa tietokannan eheyden valvonnasta voidaan toteuttaa deklaratiivisesti DDL -määrittelyillä 1. Identifioitavuus (primary key) 2. Viite-eheys (foreign key) 3. Tietotyypit 4. Välttämättömyys / mahdollisuus (null määritykset) 5. Yksikäsitteisyys (unique) 6. Sallitut arvot ja oletusarvot (osin) Ä Eheysmäärittelyn tuki vaihtelee toimittajakohtaisesti Ä Osa tiedonhallintajärjestelmistä tukee myös sovelluskohtaisia eheyssääntöjä / business rules (assertions) Etuja: Standardinmukainen (?) yksinkertainen määrittely Määrittelyt tallessa keskitetysti tietohakemistossa Hyvä suorituskyky
HELIA 3 (15) Proseduraalinen eheysvalvonta Eheyssääntöjä sekä muuta toiminnallisuutta voidaan toteuttaa myös proseduraalisesti: a) herätetoiminnoilla (triggers / active rules) b) tallennetuilla rutiineilla (proseduurit ja funktiot) Herätetoiminnot liittyy tietyn taulun tiettyyn tapahtumaan laukeaa implisiittisesti (epäsuorasti) ei vaadi suoritusoikeuksia Proseduurit ja funktiot itsenäinen kutsutaan eksplisiittisesti (suoraan) vaati suoritusoikeuden myönnön (Oracle) Ä Myös herätetoimintojen ja tallennettujen rutiinien tuki (ja syntaksi) vaihtelee toimittajittain Ei mukana SQL-92:ssa Mukana SQL3:ssa
HELIA 4 (15) Eheysvalvonnan suunnittelusta Sääntöjen määrittely Lähtökohta: 1. Käsitteellisen suunnittelun yhteydessä määritellyt sovelluskohtaiset säännöt 2. Loogisen suunnittelun yhteydessä määritellyt eheyssäännöt Ä Sääntö on ilmaistava niin riittävän tarkasti, jotta sen toteutusehto voidaan tietokannassa määritellä ja tarvittavat toimenpiteet suorittaa! Ä Sääntöjen määrittely edellyttää kohdealueen hyvää tuntemusta
HELIA 5 (15) Rikelista Luetteloi kaikki tietokantatapahtumat, jotka voivat rikkoa ko. eheyssääntöä Å Pohja herätetoimintojen määrittelylle Ä Rikelistan määrittely vaatii tietokannan rakenteen ja tiedonhallintajärjestelmän tuntemusta (ja eheyssääntöjen ymmärtämistä...) Virheiden käsittely Laadi tarvittaessa virheilmoitukset herätetoiminnolle Ä (Virheiden käsittely oma suunnitteluongelmansa: numerointi, kieli, sijainti,...) esim. Fleming...
HELIA 6 (15) Toteutusvaihtoehdot Ä Käytä deklaratiivista eheysmäärittelyä niin pitkälle kuin se on tuotteessa mahdollista Ä Myös silloin kun tavoitteena on RDBMS - toimittajariippumaton sovellus (rajoitukset tulevat vastaan aikaisemmin) Ä osa viite-eheys toiminnoista toteutettava proseduraalisesti (tyypillisesti ne, joita SQL-92 ei sisällä) on delete / update SET NULL / SET DEFAULT Ä huom! suhde deklaratiiviseen eheysmäärittelyyn Å Sovelluskohtaiset säännöt jäävät tyypillisesti proseduraalisesti toteutettavaksi Ä yhden säännön toteutus voi vaatia useamman herätetoiminnon
HELIA 7 (15) Esim. elokuvatietokannassa anekdootin pitää liittyä vähintään yhteen elokuvaan, organisaatioon tai henkilöön Toteutus: Ä assertio? Ä herätetoiminto? Ä 3sp-kirjasto-ohjelma? Ä sovellusohjelma? Ä käyttöohjeet? Ä muu? Ä Huolehdi eheydestä ensisijaisesti tietokantatasolla Kerran tietokannassa > kaikissa sovellusohjelmissa Ä Kaikki tietoon perustuva toiminnallisuus on määritelty keskitetysti Ä voimassa myös ad hoc työkaluja käytettäessä Ä Suunnittele huolellisesti, jottei synny ristiriitatilanteita! Ä Tarvittaessa tarkista tiedonhallintajärjestelmän toimittajan dokumentaatiosta deklaratiivisten sääntöjen ja proseduraalisten toimintojen suoritusjärjestys! 1. Deklaratiiviset tarkistukset 2. Proseduraaliset tarkistukset
HELIA 8 (15) Herätetoiminnot - Triggerit / Aktiiviset säännöt Määrittely 1. Laukaiseva toiminto Jokin tai useampi päivityskomennoista (insert, update, delete) 2. Suorituksen ajoitus a) ennen laukaisevan komennon suoritusta b) laukaisevan operaation jälkeen 3. Suorituksen kohdistus a) Suoritus / komento b) Suoritus / rivi 4. Suoritusehto SQL-ehtolause 5. Toiminto SQL-skripti (tai Oraclessa PL/SQL) Ä Ei commit eikä rollback komentoja! Ä Ei peruuttamattomia operaatioita (esim. Oraclessa DDL-lauseet) Ä Myös herätetoiminnon suorittama operaatio peruutettavissa / vahvistettavissa (commit / rollback) Ä Sisältyy samaan transaktioon kuin laukaiseva toiminto! Ä Voi estää laukaisevan komennon suorituksen! (jos määritelty BEFORE)
HELIA 9 (15) SQL3:n syntaksi CREATE TRIGGER <trigger name> { BEFORE AFTER } <trigger event> ON <table name> [REFERENCING <old or new values alias list> [FOR EACH {ROW STATEMENT} ] [WHEN (search condition)] <triggered SQL statement> <trigger event> ::= INSERT DELETE UPDATE [ OF <column list> <old or new values alias list> ::= OLD [ROW] [AS] old values alias NEW [ROW] [AS] new values alias OLD TABLE [AS] <old values table alias> NEW TABLE [AS] <new values table alias>
HELIA 10 (15) Oracle 7 8:n syntaksi
HELIA 11 (15) esim. CREATE TRIGGER korotus_chk BEFORE UPDATE OF palkka ON tyolainen FOR EACH ROW WHEN (NEW.palkka < OLD.palkka OR NEW.palkka > 1,1 * OLD.palkka) BEGIN RAISE_APPLICATION_ERROR (-20502, Palkkaa ei saa laskea. Korotuksen oltava alle 10 %); END;
HELIA 12 (15) Suoritus ja käyttöoikeudet Ä Oraclessa triggeri käyttää omistajansa käyttöoikeuksia! Ä Ts. triggerin mahd. Suorittamia päivitystoimintoja varten ei käyttäjille tarvitse antaa käyttöoikeuksia Standardin mukaan käyttäjä voi määritellä triggerin, jos hänelle on myönnetty trigger-oikeus ko. tauluun.
HELIA 13 (15) Käyttötilanteita Ennen komentoa Triggereissä käytettyjen globaalien muuttujien alustus Päivityksen estäminen, jos tietoturva ei ole ok Ennen riviä Johdettujen kenttien laskenta Päivityksen estäminen, jos tietoturva ei ole ok Jälkeen rivin Auditointi Jälkeen komennon Auditointi
HELIA 14 (15) Muita käyttökohteita Eheysvalvonnan lisäksi Tietoturva kompleksiset tietoturvatarkastukset auditointi Replikointi on-line Suorituskyvyn parantaminen kompleksisten johdettujen ominaisuuksien ylläpito Ä denormalisoi harkiten!
HELIA 15 (15) SQL3:n Assertiot CREATE ASSERTION <constraint name> CHECK (search condition) <constraint attributes> constraint attributes> ::= <constraint check time> [ [NOT] DEFERRABLE ] [ [NOT] DEFERRABLE ] <constraint check time> <constraint check time> ::= INITIALLY DEFERRED INITIALLY IMMEDIATE Esim. CREATE ASSERTION tutki_palkka CHECK ((SELECT AVG(palkka) FROM henkilo) > 10000) INITIALLY IMMEDIATE NOT DEFERRABLE; Keskipalkan oltava suurempi kuin 10.000 Ä jos päivitys muuttaisi dataa niin, että keskipalkka <= 10.000, syntyy virheilmoitus