UNIVERSITETET. triggere og views. Institutt for Informatikk. INF Arne Maus 1

Like dokumenter
Integritetsregler i SQL

Integritetsregler i SQL

SQL: Integritetsregler, triggere og views

Integritetsregler i SQL. Primærnøkler

UNIVERSITETET I OSLO SQL. Structured Query Language. (forts.) Institutt for Informatikk. INF Ellen Munthe-Kaas 1

INF1300 SQL Structured Query Language del 1. Stoff som blir/ble forelest i oktober 2013

UNIVERSITETET SQL. Structured Query Language (forts.) Institutt for Informatikk. INF Ellen Munthe-Kaas 1

INF1300 Introduksjon til databaser

SQL Structured Query Language. Definere tabeller Skranker Fylle tabeller med data

INF1300 Introduksjon til databaser: SQL Structured Query Language. En første introduksjon Lysark til forelesning onsdag 22.

INF1300 Introduksjon til databaser: SQL Structured Query Language. En første introduksjon Lysark til forelesning mandag 14.

UNIVERSITETET I OSLO SQL. Structured Query Language. (forts.) Institutt for Informatikk. INF Ragnar Normann 1

SQL Structured Query Language

INF1300 Introduksjon til databaser: SQL Structured Query Language

INF1300 Introduksjon til databaser

1. SQL datadefinisjon og manipulering

Relasjoner terminologi

Datamodellering og databaser SQL, del 2

SQL 3: Opprette tabeller, datainnsetting og utsnitt

Datamodellering og databaser SQL, del 2

SQL Structured Query Language

Oppgaver Oppgave a: Sett opp mulige relasjoner

Oppgave: Finn navn og tittel på alle som har arbeidet på prosjektet «Vintersalg»

Datamodellering og databaser SQL, del 2

Databaser: Relasjonsmodellen, del I

Institutt for datateknikk. Fag TDT4145 Datamodellering og databasesystemer Løsningsforslag til øving 3: Algebra og SQL

Databaser. Relasjonsmodellen 1 Læreboka: Kap. 2 Relasjonsmodellen Faglærere: Tore Mallaug, Kjell Toft Hansen

Tilkobling og Triggere

UNIVERSITETET I OSLO SQL. Structured Query Language. Institutt for Informatikk. INF Ellen Munthe-Kaas 1

SQL: Datatyper m.m. Evgenij Thorstensen V18. Evgenij Thorstensen SQL: Datatyper m.m. V18 1 / 12

DBMS Database Management System (repetisjon) Programmeringsgrensesnitt. Serialiserbarhet

Metaspråket for å beskrive grammatikk

Repetisjon: Normalformer og SQL

Notater: INF1300. Veronika Heimsbakk 8. januar 2013

Utvikling fra kjernen og ut

UNIVERSITETET I OSLO SQL. Structured Query Language. (The intergalactic dataspeak) Institutt for Informatikk. INF Ellen Munthe-Kaas 1

INF1300 Introduksjon til databaser

Dagens tema: Relasjonsmodellen (funksjonelle avhengigheter og nøkler, integritetsregler) Realisering: Fra ORM til relasjoner

SQL. SQL-standarder. Flere standarder: ANSI SQL SQL2 (SQL-92) SQL3 (SQL-99) = SQL2 + objekt-relasjonelle egenskaper mm

SQL SELECT-FROM-WHERE. Skjemadefinisjon og datainnsetting i SQL. Semantikk bak ein-relasjons-spørring

Oppgave 1 (Opprett en database og en tabell)

INF1300 Introduksjon til databaser

Dagens tema: Oppdateringsanomalier Normalformer

Oppdateringsanomalier Normalformer

UNIVERSITETET I OSLO. Relasjonsmodellen. Relasjoner og funksjonelle avhengigheter. Institutt for Informatikk. INF Ellen Munthe-Kaas 1

Fag TDT4145 Datamodellering og databasesystemer Løsningsforslag til øving 3: Algebra og SQL

UNIVERSITETET I OSLO SQL. Structured Query Language. (The intergalactic dataspeak) INF Ellen Munthe-Kaas 1. Institutt for Informatikk

UNIVERSITETET SQL-99. Institutt for Informatikk. INF Ellen Munthe-Kaas 1

IN2090 Introduksjon til databaser

Løsningsforslag til eksamen i IN2090 Databaser og datamodellering og INF1300 Introduksjon til databaser 6. desember :30 18:30 (4 timer)

INF1300 Introduksjon til databaser

INF1300 Introduksjon til databaser

IN2090 Databaser og datamodellering 07 Datamanipulering

INF 329: Web-Teknologier. Dataimplementasjon. Fra Kapittel 11 i «Designing Data-Intensive Web Applications» Presentasjonsdato: 17/10/2004

HØGSKOLEN I SØR-TRØNDELAG

Løsningsforslag maskindatabasen på Ifi SQL og normalisering

INF1300 Introduksjon til databaser

UNIVERSITETET SQL. Structured Query Language. Institutt for Informatikk. INF Ellen Munthe-Kaas 1

Sensorveiledning for IN2090 og INF desember :30 18:30 (4 timer)

Prosedyrer. Lars Vidar Magnusson. October 26, Lars Vidar Magnusson () Forelesning i DAS October 26, / 19

UNIVERSITETET I OSLO SQL. Structured Query Language. Institutt for Informatikk. INF Ellen Munthe-Kaas 1

UNIVERSITETET I OSLO SQL. Structured Query Language. Institutt for Informatikk. INF Ellen Munthe-Kaas 1

UNIVERSITETET I OSLO SQL. Structured Query Language. Institutt for Informatikk. INF Ellen Munthe-Kaas 1

INF3100 Databasesystemer

Relasjonsdatabasedesign

Flere skranker i ORM Integritetsregler med «CHECK» i SQL

Relasjonsdatabasedesign

1. Innføring i bruk av MySQL Query Browser

UNIVERSITETET I OSLO SQL. Structured Query Language. (The intergalactic dataspeak) Institutt for Informatikk. INF Ragnar Normann 1

Relasjonsdatabasedesign

Relasjonsdatabasedesign

SQL Structured Query Language

EKSAMEN DATABASER

INF3100 V2018 Obligatorisk oppgave nr. 2

Spørsmålskompilering del 1

Oppgave 1 1. Spørring: Resultattabell: 2. Spørring: Resultattabell: 3. Spørring:

Spørsmålskompilering del 1

1. Relasjonsmodellen Kommentarer til læreboka

Oppdateringsanomalier. Normalformer. Institutt for informatikk INF

IN2090 Databaser og datamodellering 07 Datamanipulering

SQL-omgivelser. SQL-omgivelse

INF1300 Relasjonsalgebra. Et matematisk fundament for å forstå SQL-setninger

Relasjonsdatabasedesign

Høgskolen i Telemark EKSAMEN 6102 DATABASER Tid: Hjelpemidler: Vedlegg: Eksempeldata til oppgave 1

Miniverden og ER- modell

INF1300 Introduksjon til databaser

UNIVERSITETET. Relasjonsdatabasedesign

Utvikling fra kjernen og ut

EKSAMEN 6102 / 6102N DATABASER

Relasjonsdatabasedesign

Komplisert eksempel. IN2090 Databaser og datamodellering 07 Datamanipulering. Flere eksempler: Kombinere aggregater. Komplisert eksempel med WITH

Ekstramateriale: Eksempel på PostgreSQL 8.4 og SQL:1999 (ikke pensum 2012)

HØGSKOLEN I SØR-TRØNDELAG

Eksamensoppgave i TDT4145 Datamodellering og databasesystemer

INF3100 Databasesystemer

Normalisering. Hva er normalisering?

INF212 - Databaseteori. Kursinnhold

EKSAMENSFORSIDE Skriftlig eksamen med tilsyn

Samtidighetsfenomener og anomalier i eksekveringsplaner. INF Ellen Munthe-Kaas 1

Skranker og avledninger

Transkript:

UNIVERSITETET IOSLO SQL: Integritetsregler, triggere og views Institutt for Informatikk INF3100 28.2.2012 Arne Maus 1

Integritetsregler i SQL Kandidat- og primærnøkler Referanseintegritet fremmednøkler Domenebegrensende integritetsregler skranker på attributter og tupler Interrelasjonsskranker assertions Innen en relasjon Triggere Mellom relasjoner INF3100 28.2.2012 Arne Maus 2

Primærnøkler Kan deklareres i create table sammen med primærnøkkelattributtet ib t (bare hvis attributtet utgjør primærnøkkelen alene) create table MovieStar( name char(30) primary key,... ); Kan deklareres separat i create table etter attributtdeklarasjonene (må gjøres slik hvis primærnøkkelen består av flere attributter): create table MovieStar( name char(30), nickname char (20),... primary key (name,nickname) ); INF3100 28.2.2012 Arne Maus 3

Regler for primærnøkler Maks én primærnøkkeldeklarasjon pr. relasjon Konsekvenser av deklarasjonen: To tupler i relasjonen får ikke stemme overens i alle attributtene i primærnøkkelen (selv ikke med bagrepresentasjon!) Forsøk på brudd ved insert eller update skal avvises av DBMSet Attributtene i primærnøkkelen får ikke inneholde null Primærnøkkelskranken må sjekkes ved hver: insert (nytt tuppel har samme primærnøkkel som et annet tuppel) update (endring av primærnøkkel til en som finnes) Med primærnøkler må tabellen lagres som mengde ikke bag INF3100 28.2.2012 Arne Maus 4

Kandidatnøkler Kan deklareres i create table sammen med nøkkelattributtet t (bare hvis attributtet utgjør kandidatnøkkel alene) create table MovieStar( address varchar(255) unique,... ); Kan deklareres separat i create table etter attributtdeklarasjonene (slik gjøres det ved flere attributter i nøkkelen) create table MovieStar( name varchar(40), address varchar(255),... unique (name,address) ); INF3100 28.2.2012 Arne Maus 5

Kandidatnøkler, regler Flere kandidatnøkkeldeklarasjoner er tillatt pr. relasjon Konsekvenser av deklarasjonen: To tupler i relasjonen får ikke stemme overens i alle attributtene i kandidatnøkkelen Kan brytes hvis ett eller flere av attributtene i kandidatnøkkelen inneholder null Kandidatnøkkelskranken må sjekkes ved hver insert og hver update INF3100 28.2.2012 Arne Maus 6

Indekser på kandidatnøkler DBMSer bygger vanligvis i indekser automatisk ti på primærnøklene. For hver kandidatnøkkel må man vurdere spesielt om det bør deklareres indeks på nøkkelen Syntaks avhenger av DBMSet I Postgres bygges automatisk indekser på kandidatnøklene Noen SQL-implementasjoner tillater deklarasjon av kandidatnøkkel + indeks i en og samme setning: create unique index AddressIndex on MovieStar(address); Hvis det er opprettet indeks på en nøkkel, benyttes denne under sjekk av flerforekomster Ellers: Må i verste fall søke gjennom hele relasjonen INF3100 28.2.2012 Arne Maus 7

Referanseintegritet = Deklarasjon av fremmednøkler: fremmednøkler create table Studio(.. presc# int references MovieExec(cert#),..); Alternativt: create table Studio(.. presc# int,.. foreign key (presc#) references MovieExec(cert#)..); INF3100 28.2.2012 Arne Maus 8

Fremmednøkler, regler Konsekvenser av deklarasjonen: De refererte attributtene må være deklarert unique eller primary key Verdier ( null) som opptrer i fremmed-nøkkelens refererende attributter må opptre i de refererte attributtene Referanseintegritet it t må sjekkes både ved insert, update og delete INF3100 28.2.2012 Arne Maus 9

Opprettholdelse av referanseintegritet Tre strategier t (aktuelle bare ved update, delete): ) no action (= default strategi): Avvis modifikasjoner som bryter regelen cascade: Endringer i referert verdi påtvinges også refererende verdi (Hvis du sletter et tuppel t, sletter du alle tupler som refererer t (rekursivt)) set null: Sletting av referert verdi forårsaker endring av refererende verdi til null Strategiene velges separat for hver update, delete på den enkelte fremmednøkkel: foreign key (presc#) references MovieExec(cert#) on delete cascade INF3100 28.2.2012 Arne Maus 10

Midlertidige brudd på referanseintegriteten Nødvendig ved sirkulære avhengigheter mellom relasjoner 1. Gruppér flere SQL-setninger i en transaksjon: start transaction; SQL-setninger; commit/rollback; 2. Kan instruere SQL-systemet om ikke å sjekke referanseintegritet før transaksjonen er endelig avsluttet (committed) i. not tdeferrable (default): Skranken k skal sjekkes umiddelbart når sjekk er påkrevd ii. deferrable: Sjekk (kan) utsettes a. initially iti deferred: d Sjekk utsettes tt i utgangs-punktet t til slutten av inneværende transaksjon b. initially immediate: Sjekk gjøres i utgangs-punktet før modifikasjon av databasen INF3100 28.2.2012 Arne Maus 11

Sirkulær referanseintegritet Skjema: Ansatt(Anavn, Adr, #Pnum, #Gno) Gruppe(Gnavn, #Gno) GruppeAnsatte (#G,#Pnum)#Pnum) og vi krever at tfor hver ansatte somjobber i en gruppe, skal det være et tuppel i GruppeAnsatte, og at alle de som er registrert i GruppeAnsatte skal referere til et eksisterende Ansatt-tuppel. Når vi ansetter Per på gruppe 3, ser vi at uansett om vi legger in Per først eller gruppeansettelsen, bryter vi integritetsregelen midlertidig. INF3100 28.2.2012 Arne Maus 12

Deklarasjon av deferrable I create table: (i) Deklarer deferrable (ii) Navngi skranken (kan sløyfes): presc# int unique constraint t PresC#ForeignKey references MovieExec(cert#) deferrable initially deferred Kan senere endre fra deferred til immediate og omvendt: set constraint PresC#ForeignKey immediate;. ṡet set constraint PresC#ForeignKey deferred; INF3100 28.2.2012 Arne Maus 13

Skranker på attributter og tupler Bidrar til å begrense lovlige (kombinasjoner av) verdier i attributtene innen en relasjon Tommelfingerregel: Bare svært enkle skranker bør formuleres på denne måten! INF3100 28.2.2012 Arne Maus 14

Skranke på ett attributt: not null I create table: presc# int references MovieExec(cert#) not null Konsekvenser: Kan ikke sette inn tuppel med verdien null i attributtet Kan ikke endre verdien til null senere set null-policyen kan ikke benyttes (dette innvirker på hvilke views som blir oppdaterbare) INF3100 28.2.2012 Arne Maus 15

Skranke på ett attributt: check I create table: presc# int references MovieExec(cert#) check (presc# >= 100000 and presc# < 1000000); Angir en betingelse på attributtet Betingelsen kan henvise til attributtet selv, og til andre attributter via subquery Sjekkes ved hver endring av attributtets verdi NB Sjekkes ikke hvis check refererer til andre attributter og disse endres, mens attributtet med check-skranke ikke endres! INF3100 28.2.2012 Arne Maus 16

Skranke på et tuppel: check I create table:... check ((gender = F or name not like Ms.% ) and (gender = M or name not like Mr.% ))... Angir en betingelse på et tuppel i relasjonen Betingelsen kan henvise til attributter i relasjonen, og til attributter i andre relasjoner via subquery Sjekkes hver gang et tuppel settes inn eller oppdateres NB Sjekkes ikke hvis check refererer til attributter i andre relasjoner og disse endres, mens det ikke er endringer i inneværende relasjon! INF3100 28.2.2012 Arne Maus 17

Har: Vise omformingsregler (SQL støtter ikke ) check ((gender = F or name not like Ms.% ) and ((gender = M or name not like Mr.% ) A name like Ms Ms.% % gender = F A B (A and B) A B B A B A B B: True B: False A: True true false A: False true true B A B: True B: False A: True true false A: False true true Hvis evalueringsskjemaet for to uttrykk er likt for alle kombinasjoner av true, false for de variablene som inngår (her A,B), er uttrykkene logisk ekvivalente. 18

Endring av skranker Skranker k kan legges til, endres, slettes, når som helst Man må i så fall navngi skrankene sammen med deklarasjonen av dem Endring av tabellskranker: immediate deferred ved set constraint... alter table: Legg til eller slett skranker alter table MovieStar drop constraint NameIsKey; alter table MovieStar add constraint MyKey primary key (name); alter table MovieStar add constraint NoAndro check (gender in ( F, M )); INF3100 28.2.2012 Arne Maus 19

Assertions I Assertions er en del av databaseskjemaet, t på lik linje med relasjonsskjemaer og views: create assertion SumLength check (10000 >= all (select sum(length) from Movie group by studioname)); INF3100 28.2.2012 Arne Maus 20

Assertions II Assertions formuleres som et boolsk uttrykk som alltid må evalueres til true Kan involvere flere relasjoner Sjekkes når en av de involverte relasjonene endres Vanskelig å implementere effektivt Kan fjernes igjen: drop assertion SumLength Assertions støttes ikke av Postgres INF3100 28.2.2012 Arne Maus 21

Triggere Serie aksjoner assosiert med angitte hendelser Utføres når hendelsen inntreffer Vekkes når en hendelse skal til å inntreffe (typisk: insert, update, delete mhp. gitt relasjon) Deretter testes en betingelse Hvis betingelsen ikke holder, avbrytes triggingen Hvis betingelsen er oppfylt, utføres en aksjon Aksjonen kan hindre hendelsen i å inntreffe eller omgjøre den mm. Generelt er aksjonen en sekvens av databaseoperasjoner INF3100 28.2.2012 Arne Maus 22

Valgmuligheter for triggere i SQL 1. Aksjonen kan eksekveres før eller etter den triggende hendelsen 2. Aksjonen kan referere til gamle og/eller nye tuppelverdier som blir satt inn, slettet eller oppdatert i den triggende hendelsen 3. Oppdateringshendelser kan begrenses til et gitt attributt/ en gruppe attributter 4. En betingelse kan angis; da trigges det bare hvis hendelsen inntreffer og betingelsen evaluerer til true Dette gjøres i en when-klausul 5. Programmereren kan spesifisere at aksjonen skal utføres enten én gang for hvert modifisert tuppel eller én gang for samtlige modifiserte tupler Postgres støtter bare et subset av triggerfunksjonaliteten i SQL-standarden! d Eksemplene på de neste lysarkene har konstruksjoner som ikke støttes i Postgres. INF3100 28.2.2012 Arne Maus 23

Trigger, eksempel 1 Skjema: MovieExec(name, address, cert#, networth) create trigger NetWorthTrigger after update on MovieExec referencing old row as OldRow, new row as NewRow for each row when (OldRow.netWorth > NewRow.netWorth) update MovieExec set networth = OldRow.netWorth where cert# = NewRow.cert#; INF3100 28.2.2012 Arne Maus 24

Trigger, eksempel 2 create trigger AvgNetWorthTrigger after update of networth on MovieExec referencing old table as OldStuff, new table as NewStuff for each statement when (500000 > (select avg(networth) from MovieExec)) begin delete from MovieExec where (name, address, cert#, networth) in NewStuff; insert into MovieExec (select * from OldStuff); end; INF3100 28.2.2012 Arne Maus 25

Virtuelle og materialiserte views Tuplene i et vanlig view beregnes først når viewet navngis i en query. Slike views kalles derfor også for virtuelle views Hvis et view brukes mye, kan det materialiseres: create materialized view viewnavn as select.. from..; Tuplene i viewet blir da lagret og må oppdateres enten når de underliggende relasjonene endres (kan være kostbart) eller periodisk (f.eks. hver natt) (dataene i viewet kan bli foreldet i løpet av perioden) Postgres støtter ikke materialiserte views INF3100 28.2.2012 Arne Maus 26

Modifisering av viewdata Oppdaterbare views Virtuelle views hvor det er mulig å oversette modifikasjon på tupler i viewet til modifikasjoner på tupler i basisrelasjonene Forenklet: Et view er oppdaterbart hvis det er definert ved en select (ikke distinct) på attributter fra én basisrelasjon eller ett annet oppdaterbart view R hvor where ikke involverer R i et subquery listen i select er fyldig nok til at vi kan etterfylle ikke angitte attributter med defaultverdier eller null og slik konstruere et basistuppel som produserer det angitte viewtuppelet INF3100 28.2.2012 Arne Maus 27

Instead-of triggere En instead-of trigger er en trigger som avskjærer hendelser rettet mot et virtuelt view og erstatter hendelsene med alternative aksjoner F.eks. kan triggeren oversette en insert, update eller delete mhp. viewet til insert/ update/ delete mot de underliggende relasjonene INF3100 28.2.2012 Arne Maus 28

Eksempel på instead-of trigger create view ParamountMovies as select title, year from Movies where studioname = Paramount ; create trigger ParamountInsert instead of insert on ParamountMovies aa o referencing new row as NewRow for each row insert into Movies(title, year, studioname) values(newrow.title, NewRow.year, Paramount ); INF3100 28.2.2012 Arne Maus 29

Øvingsoppgave g Skjema: Prosjekt(P#,Pnavn,Kunde,Pleder,StartDato) Pnavn Pleder Ansatt(A#,Navn,Tittel,Fdato,Pnr,AnsDato) Timeliste(A#,Dato,P#,Timer) Timer) Kunde(K#,Knavn,Adresse) Oppgave: Finn navn og tittel på de ansatte som har arbeidet på alle prosjekter som er påbegynt i dette århundret og er bestilt av kunden «Pust og pes AS». INF3100 28.2.2012 Arne Maus 30

Øvingsoppgave g Prosjekt(P#,Pnavn,Kunde,Pleder,StartDato) Ansatt(A#,Navn,Tittel,Fdato,Pnr,AnsDato) AnsDato) Timeliste(A#,Dato,P#,Timer) Kunde(K#,Knavn,Adresse) Løsning: select Navn, Tittel from Ansatt A where not exists ( select * from Kunde K, Prosjekt P where Knavn = Pust og pes AS and K# = Kunde and StartDato > 2000-12-31 and not exists ( select * from Timeliste T where T.A# = A.A# and T.P# = P.P# ) ) INF3100 28.2.2012 Arne Maus 31

Øvingsoppgave g Prosjekt(P#,Pnavn,Kunde,Pleder,StartDato) Ansatt(A#,Navn,Tittel,Fdato,Pnr,AnsDato) AnsDato) Timeliste(A#,Dato,P#,Timer) Kunde(K#,Knavn,Adresse) De A-er hvor det ikke er noen prosjekter (Pust&Pes) som A ikke har jobbet på Løsning: select Navn, Tittel from Ansatt A where not exists ( select * from Kunde K, Prosjekt P where Knavn = Pust og pes AS and K# = Kunde and StartDato > 2000-12-31 and not exists ( Det A har jobbet select * from Timeliste T for prosjektet P# where T.A# = A.A# and T.P# = P.P# ) ) Pust&Pes-prosjektene A ikke har jobbet på INF3100 28.2.2012 Arne Maus 32