Dette er vår første obligatoriske oppgave i kurset Moderne Databaseteknologi.



Like dokumenter
1. SQL datadefinisjon og manipulering

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

Tilkobling og Triggere

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

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

Metaspråket for å beskrive grammatikk

Integritetsregler i SQL. Primærnøkler

Integritetsregler i SQL

Oppgaver Oppgave a: Sett opp mulige relasjoner

SQL 3: Opprette tabeller, datainnsetting og utsnitt

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

Datamodellering og databaser SQL, del 2

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

Objektorientering i ER-modeller EER-modeller Enhanced Entity Relationship Models

Databaser: Relasjonsmodellen, del I

Integritetsregler i SQL

Miniverden og ER- modell

Repetisjon: Normalformer og SQL

1. SQL spørringer mot flere tabeller

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

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

TDT4102 Prosedyre og Objektorientert programmering Vår 2014

En liten rekap. Spørrespråk. I dag SELECT

Oppgave 1 (Opprett en database og en tabell)

Datamodellering og databaser SQL, del 2

Databaser & objektorientering.

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

TDT4102 Prosedyreog objektorientert programmering Vår 2016

ITGK - H2010, Matlab. Dagens tema : Teori - Databaser

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

Datamodellering 101 En tenkt høgskoledatabase

Datamodellering og databaser SQL, del 2

Databaser kort intro. Tom Heine Nätt

Utvikling fra kjernen og ut

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

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

<?php. count tar en array som argument, og returnerer et tall som uttrykker antallet innførsler i arrayen.

Applikasjonsutvikling med databaser

Løsningsskisse til Eksamensoppgave i TDT4145 Datamodellering og databasesystemer

Databaser. Relasjonsmodellen 2 Læreboka: Kap. 2 Relasjonsmodellen

HVA ER XML? extensible Markup Language En standardisert måte å strukturere ulike typer data Åpent format Enkelt:

Introduksjon til beslutningsstrukturer

[Kurssidene] [ ABI - fagsider bibin ] Michael Preminger (michaelp@hio.no) 07/ Vi holder orden på verdier med hjelp av variabler

HØGSKOLEN I SØR-TRØNDELAG

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

Labquality/NKK ELEKTRONISK RESULTATSKJEMA VIA INTERNET. Åpning av skjemaet. Logg inn på Participant services. Velg resultatskjemaet

ORDBMS og OODBMS i praksis

En lett innføring i foreninger (JOINs) i SQL

Utviklingssak/ID Resume Endring (g2) Rettet i versjon (g1) Rettet i versjon

INF1300 Introduksjon til databaser

EKSAMEN. Emne: Webprogrammering med PHP (kont.) Webprogrammering 1 (kont.) Eksamenstid:

SQL: Integritetsregler, triggere og views

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

Romlig datamanipulering

1. Innføring i bruk av MySQL Query Browser

IN2090 Databaser og datamodellering. 08 Typer og skranker

Databasers typesystem. IN2090 Databaser og datamodellering. 08 Typer og skranker. SQL-standarden vs. RDBMSer. Hvilke datatyper har vi

Eksamensoppgave i TDT4145 Datamodellering og databasesystemer

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

Løsningsforslag matoppskrifter modellering

IN2090 Databaser og datamodellering. 08 Typer og skranker

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

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

Dagens program. Kunnskapsorganisasjon og gjenfinning 1. Spørring mot databaser: SQL 2 - Spørring mot flere tabeller

HØGSKOLEN I SØR-TRØNDELAG

Å bruke Java API-et til å sortere tabeller/arraylister der elementene er (referanser til) objekter

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

TDT4102 Prosedyre og Objektorientert programmering Vår 2014

Eksamensoppgave i TDT4145 Datamodellering og databasesystemer

Kanter, kanter, mange mangekanter

EKSAMEN 6102 / 6102N DATABASER

1. Relasjonsmodellen Kommentarer til læreboka

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

Videregående programmering 6

IN2090 Introduksjon til databaser

Oppgavesett videregående kurs i NVivo 9

EKSAMEN (Konvertert fra en gammel PHP-eksamen)

Testrapport for Sir Jerky Leap

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

IN2090 Databaser og datamodellering 07 Datamanipulering

1. Profiler og variabler

SQL Introduksjonskurs. Oversikt

Å programmere databasetjeneren JavaDB. Programkoden ligger i databasen

EKSAMEN. Les gjennom alle oppgavene før du begynner. Husk at det ikke er gitt at oppgavene står sortert etter økende vanskelighetsgrad.

Bruke SQL fra Python. Med Psycopg2

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

INF1300 Introduksjon til databaser

Klasser. Webprogrammering høsten Objekter. Eksempelklasser og -objekter. 2 of :56. 1 of :56

TDT4102 Prosedyreog objektorientert programmering Vår 2016

Enalyzer Norge. Nice to know - ESS

Eksamen i Internetteknologi Fagkode: IVA1379

Utvikling fra kjernen og ut

TDT4300 Datavarehus og datagruvedri3, Våren 2014

SELECT DISTINCT Fornavn, Etternavn, Programtittel FROM Program P, Medvirkende M, Deltagelse D. SELECT Tilgjengelighet FROM Program

SQL Structured Query Language

DATAUTFORSKNING I EG, EG 7.1 OG EGENDEFINERTE FUNKSJONER SAS FANS I STAVANGER 4. MARS 2014, MARIT FISKAAEN

Hvordan aktivere pakker og enkelttitler

INF1300 Introduksjon til databaser: SQL Structured Query Language

1. Mer om oppbyning av XML-dokument

Transkript:

Innledning Dette er vår første obligatoriske oppgave i kurset Moderne Databaseteknologi. Oppgaven går ut på å implementer en database. Vi skal utforske og implementere noen av de mer avanserte mulighetene som ligger i PostgreSQL, dvs Structured Query Language 3 (SQL3), og som går utover de standardmulighetene vi implementerte i Oracle i grunnkurset i databaser. Databasen skal inneholde minimum 4 tabeller med et antall tupler i hver tabell. Databasen skal være normalisert og har følgende funksjonalitet/innhold: Arv mellom tabeller Object Identifier (OID) som datatype Temporale datatyper Arrayer som lagrede verdier Binary Large Objects (BLOBS) som datatype Funksjoner i form av server side triggers Regler Utenom selve databasen skal vi også utforme egne SQL-spørringer som viser bruken av databasen. Rapporten som følger gir en beskrivelse av databasen Cool CD. Moderne Databaseteknologi, Høgskolen i Østfold 2003 1

Innholdsfortegnelse 1. FORMÅLET MED DATABASEN... 4 2. BEGRENSNINGER... 4 3. EN OVERSIKT OVER DATABASENS KRAV, STRUKTUR, TABELLER OG ATTRIBUTTER... 5 3.1 Krav til databasen... 5 3.2 Entitetstyper... 7 3.3 Relasjonstyper... 8 3.4 Konseptuell Entity Relation (ER) modell... 8 3.5 Logisk ER-modell... 9 3.6 Dataordbok... 11 3.6.1 Sterke entiteter... 11 3.6.2 Svake entiteter... 14 3.7 Krav til funksjonalitet/innhold... 15 3.7.1 Arv mellom tabeller:... 15 3.7.2 OID som datatype:... 15 3.7.3 Temporale datatyper:... 15 3.7.4 Array som lagrede verdier:... 15 3.7.5 Binary Large Objects som datatype:... 16 3.7.6 Funksjoner i form av server side triggers:... 16 3.7.7 Rules:... 16 3.8 CREATE TABLE... 17 3.8.1 Tabellen cd... 17 3.8.2 Tabellen sang... 17 3.8.3 Tabellen versjon... 17 3.8.4 Tabellen person... 18 3.8.5 Tabellen forfatter... 19 3.8.6 Tabellen artist... 19 3.8.7 Tabellen sangforfatter... 19 3.8.7 Tabellen versjoncdartist... 19 3.8.7 Tabellen versjonkom_log... 20 3.9 Server-side trigger funksjoner... 21 3.9.1 På tabellen cd... 21 3.9.2 På tabellen versjon... 22 3.9.3 På tabellen forfatter og artist... 23 3.9.4 På tabellen versjoncdartist... 24 3.9.5 Check-statements... 25 3.10 Utdrag fra DROP FUNCTION, TRIGGER, TABLE, SEQUENCE og RULES... 26 4. UTDRAG OVER INNHOLDET I TABELLENE... 27 4.1 Tabellen cd... 27 4.2 Tabellen sang... 27 4.3 Tabellen versjon... 27 4.4 Tabellen forfatter... 28 4.5 Tabellen artist... 28 4.6 Tabellen versjoncdartist... 28 4.7 Tabellen sangforfatter... 28 5. RULES... 29 6. SQL SPØRRINGER... 31 7. KRITERIER FOR EN GOD DATABASE LØSNING... 44 7.1 Kvalitetskriterier for prosjektet... 44 Moderne Databaseteknologi, Høgskolen i Østfold 2003 2

7.2 Kvalitetskriterier for virkeligheten... 45 8. KONKLUSJON... 47 9. ORDLISTE... 48 10. KILDER... 50 10.1 Bøker... 50 10.2 Web:... 50 11. VEDLEGG... 51 11.1 Vurdering av gruppe 15 av gruppe 16... 51 11.2 Vår vurdering av gruppe 16... 53 Moderne Databaseteknologi, Høgskolen i Østfold 2003 3

1. Formålet med databasen Cool CD er en personlig database hvor man kan registrer cd-plater. Vi ønsker med denne databasen å lage en oversikt over et personlig cd-arkiv som skal inneholde informasjon om cd-ene og gi en grei oversikt over dem. Databasen består av tabellene cd, artist, forfatter, sang, person, versjon, sangforfatter og versjoncdartist. Utgangspunket for databasen er at den skal benyttes til personlig bruk. Denne databasen ville ikke blitt brukt i det virkelige liv på grunn av dens begrensninger. 2. Begrensninger For at denne databasen ikke skulle bli for stor har vi satt noen begrensninger: Det er ikke mulig å registrere grupper og gruppemedlemmer. Vi har lagt opp til at det er mulig å registrere artister med fornavn og etternavn, eller bare med artistnavn. Det er ikke mulig å registrere samleplater (eks: Absolute Music). Da mange samleplater inneholder sanger med grupper og disse ikke kan registreres i databasen. Vi har blant annet å se bort fra cd-ens o Komponister o Produksjonsselskap o Sjanger Vi har også valgt å ikke registrere artistens instrumenter. Moderne Databaseteknologi, Høgskolen i Østfold 2003 4

3. En oversikt over databasens krav, struktur, tabeller og attributter 3.1 Krav til databasen Krav Begrunnelse 1 Databasen skal ikke ha noen begrensninger på antall cd-plater. Det skal være mulig å legge inn så mange plater man vil. 2 En cd skal inneholde et bilde. En cd kan gjenkjennes på grunn av bildet. Når det mangler cd-cover på en cd, så vil det vises et standardbilde. 3 En cd skal ha en tittel. En cd må alltid registreres med tittel fordi det er tittelen som oftest brukes ved søk etter en cd. 4 Databasen kan inneholde flere cd-er med lik tittel. Det forekommer at to artister kan gi ut en cd med samme tittel. 5 En cd skal registreres med et utgivelsesår. Dette fordi utgivelsesåret til cd-en er et vanlig søkeatributt. 6 Det skal finnes en sjekk som skal sørge for at det ikke er mulig å registrere cd-er med et utgivelsesår før 1965. 7 En cd kan inneholde en eller flere kommentarer. Dette fordi det ikke fantes cd-er før den tiden. Dette gir informasjon om cd-en. 8 En cd skal ha en eller flere artister. En cd kan ikke registreres uten en artist. 9 En person skal registreres med etternavn eller artistnavn. Dette fordi det er etternavnet til personen som oftest brukes ved søk etter artist eller forfatter. Et eksempel på artistnavn er Cher. 10 Artistnavn skal registreres i feltet etternavn. Hvis en artist kun har ett navn skal dette navnet skrives inn i feltet etternavn. 11 Personene kan registreres med fornavn. Det skal være valgfritt å registrere en person med fornavn. 12 Personene kan registreres med fødselsog dødsdato. 13 Personene skal registreres med nasjonalitet. 14 En sang kan ha ingen, en eller flere tekstforfattere. Dette tar vi med fordi det gir mer informasjon om artisten, samt at vi får tatt i bruk temporale datatyper i databasen. Dette gir ekstra informasjon om de ulike artistene. Dette fordi at en sang kan være instrumental og har da ingen tekstforfatter. 15 En sang skal ha en tittel. En sang må alltid registreres med tittel fordi det er tittelen som oftest brukes ved søk etter en sang. 16 Databasen kan inneholde flere sanger Dette fordi forfattere kan skrive sanger med samme tittel. med lik tittel. 17 En versjon av sangen skal ha en eller flere artister. 18 En versjon av en sang skal ha en hovedartist. En versjon kan ikke registreres uten en artist. Dette fordi at man vil ha opplysninger om alle som har vært med på versjonen av sangen. Det er ønskelig å registrere kun en hovedartist per versjon. Moderne Databaseteknologi, Høgskolen i Østfold 2003 5

19 En versjon av en sang kan ha flere biartister. 20 Det skal ikke være en maksgrense for antall biartister til en versjon. 21 Det skal ikke være en makgrense for antall tekstforfattere til en versjon. 22 En cd kan inneholde flere versjoner av samme sang. 23 Det skal ikke være noen maksgrense for antall versjoner. Det er ønskelig å kunne registrere alle biartister som har vært med på en versjon av en sang. Det skal være mulig å legge inn alle artistene som er med på en versjonen. Det skal være mulig å registrere alle tekstforfatterne til en sang. Det forekommer at cd-er inneholder ulike versjoner av samme sang. Det skal være mulig å legge inn så mange versjoner av en sang som man ønsker. 24 En versjon av sangen skal ha en utgave. Dette fordi utgaven til versjonen ofte blir brukt ved søk. 25 En utgave er enten live eller studio. Det er disse to verdiene som det er interessant å få opplysninger om. 26 En versjon av sangen kan inneholde en Dette gir informasjon om versjonen. versjonskommentar. 27 En versjon av sangen kan inneholde Dette gir ekstra informasjon om de ulike lengde på versjonen. versjonene. 28 En versjon av sangen kan inneholde en Dette gir ekstra informasjon om de ulike lydsnutt. versjonene. 29 Databasen tar kun hensyn til enkelt artister. Ikke grupper. Dette gjøres for å begrense databasen og antall tabeller. Moderne Databaseteknologi, Høgskolen i Østfold 2003 6

3.2 Entitetstyper Entiteter Beskrivelse Forekommer sang Beskriver alle sangene i databasen. En sang er skrevet av null eller flere forfattere og den kan finnes i en eller flere versjoner. versjon Beskriver alle versjonene en sang kan ha. En versjon kan finnes på en eller flere cd-er og den kan bli sunget av en eller flere artister. cd Beskriver alle cd-ene i databasen. En cd kan bestå av en eller flere versjoner og det er en eller flere artister på cd-en. artist forfatter Beskriver alle artistene som er med på cd-ene i databasen. Beskriver alle forfatterne som har skrevet tekster til sangene i databasen. En artist kan spille på en eller flere versjoner og han kan være med på en eller flere cd-er. En forfatter kan skrive en eller flere sanger. Moderne Databaseteknologi, Høgskolen i Østfold 2003 7

3.3 Relasjonstyper sang SkrevetAv forfatter sang LagesI versjon versjon FinnesI cd cd SkalHa artist artist DeltarPå versjon 3.4 Konseptuell Entity Relation (ER) modell En ER-modell er en detaljert, logisk representasjon av entiter, assosiasjoner og dataelementer for en database. Denne konseptuelle ER-modellen beskriver databasens datastruktur og er uavhengig implementasjonshensyn slik som for eksempel DBMS, applikasjonsprogrammer og programmeringsspråk. Modellen viser de sterke entitetene og relasjonene mellom dem, samt hvilke attributter som skal fungere som PN. Utgangspunktet til designet av denne modellen er kravene til databasen. sang versjon cd id {PN} 1..1 1..* id {PN} 1..* 1..* id {PN} LagesI FinnesI SkrevetAv 1..* 1..* DeltarPå 0..* 1..* 1..* forfatter id {PN} artist id {PN} 1..* SkalHa Tabellen nedenfor viser forbindelsene mellom entitetene i den konseptuelle ER-modellen. Entitet Kardinalitet Relasjon Entitet Kardinalitet sang 1..1 LagesI 1..* versjon 1..* SkrevetAv 0..* forfatter versjon 1..* FinnesI 1..* cd artist 1..* DeltarPå 1..* versjon cd 1..* SkalHa 1..* artist Moderne Databaseteknologi, Høgskolen i Østfold 2003 8

3.5 Logisk ER-modell Denne logiske ER-modellen utformes på grunnlag av den konseptuelle ER-modellen. En viktig del ved utformingen av denne modellen er normalisering. Modellen viser alle entitene, både de sterke og de svake. Entitetene sang og forfatter har et mange til mange forhold (en sang kan skrives av 0 til mange forfattere og en forfatter kan skrive en til mange sanger). Når det er et mange til mange forhold mellom to entiteter legges det inn en svak entitet, her sangforfatter. Vi har det samme forholdet mellom entitetene versjon, cd og artist og har derfor lagt inn den svare entiteten versjoncdartist. Hver entitet har ulike attributter, og attributtene som skal være PN er markert. Den viser også at entitene artist og forfatter arver fra person. Spesifikasjonen {Mandatory, And} sier at en person MÅ være en forfatter eller en artist, eller kan være både en forfatter og en artist. Den logiske modellen brukes som grunnlag for fysisk databasedesign. sang versjon cd id {PN} sangtittel 1..1 1..* LagesI id {PN} versjonutgave versjonkom versjonlengde versjonsnutt 1..1 1..* FinnesI versjon CdArtist hovedbiartist 1..* SkalHa 1..1 id {PN} cdtittel cdutaar cdkom cdbilde 1..1 1..* SkrevetAv 0..* DeltarPå sangforfatter 1..1 1..* artist Forfatter 1..1 id {PN} id {PN} forfatter {Mandatory, And} person id {PN} enavn fnavn fodselsdato dodsdato nasjonalitet Moderne Databaseteknologi, Høgskolen i Østfold 2003 9

Tabellen nedenfor viser forbindelsene mellom entitetene i den logiske ER-modellen. Entitet Kardinalitet Relasjon Entitet Kardinalitet sang 1..1 LagesI 1..* versjon 1..1 SkrevetAv 0..* sangforfatter forfatter 1..1 Forfatter 1..* sangforfatter versjon 1..1 FinnesI 1..* versjoncdartist artist 1..1 DeltarPå 1..* versjoncdartist cd 1..1 SkalHa 1..* versjoncdartist Sterke entiteter i Cool CD cd(id, cdtittel, cdutaar, cdkom, cdbilde) PRIMARY KEY id sang(id, sangtittel) PRIMARY KEY id versjon(id, versjonutgave, versjonkom, versjonlengde, versjonsnutt, sangid) PRIMARY KEY id FOREIGN KEY sangid REFERENCES sang(id) person(id, enavn, fnavn, fodselsdato, dodsdato, nasjonalitet) PRIMARY KEY id forfatter(id) PRIMARY KEY id artist(id) PRIMARY KEY id Svake entiteter i Cool CD sangforfatter(sangid, personid) FOREIGN KEY sangid REFERENCES sang(id) FOREIGN KEY personid REFERENCES forfatter(id) versjoncdartist(cdid, versjonid, personid, hovedbiartist) FOREIGN KEY cdid REFERENCES cd(id) FOREIGN KEY versjonid REFERENCES versjon(id) FOREIGN KEY personid REFERENCES artist(id) Moderne Databaseteknologi, Høgskolen i Østfold 2003 10

3.6 Dataordbok 3.6.1 Sterke entiteter Tabellen cd Kolonne Datatype + Null Nøkkel Check/Trigger Unik Ref(FK) navn lengde id SERIAL Nei PK Nei Ja FK i versjoncdartist cdtittel VARCHAR(70) Nei Nei Nei Nei cdutaar NUMBER(4) Nei Nei Ja Nei cdkom ARRAY[] Ja Nei Nei Nei cdbilde OID Ja Nei Nei Ja Hvorfor null/not null og trigger/ikke trigger Kolonne navn Null Check/Trigger id Er PN i tabellen cd. PN kan ikke være null da den unikt skal identifisere hver tuppell. Er av datatypen SERIAL. SERIAL produserer et unikt løpenummer som man ikke trenger å sjekkes. cdtittel cdutaar cdkom cdbilde Kan ikke være null fordi alle cd-er har en tittel. Kan ikke være null fordi alle cd-er har et utgivelsesår. Kan være null fordi ikke alle cd-er har en kommentar. Kan være null fordi det ikke er sikkert at vi har bilde på alle cd-er. Sjekkes ikke fordi den kan være av forskjellig lengde og inneholde forskjellige tegn (tall, bokstaver, symboler). Sjekkes fordi årstall skal bestå av 4 tall og ikke tall under 1965. Sjekkes ikke fordi den kan være av forskjellig lengde og inneholde forskjellige tegn (tall, bokstaver, symboler) samt at den kan inneholde null-verdi. Sjekkes ikke da den kan inneholde null-verdi. Tabellnavn: versjon Kolonne Datatype + Null Nøkkel Check/Trigger Unik Ref(FK) Navn lengde id SERIAL Nei PK Nei Ja FK i versjoncdartist versjonutgave CHAR(6) Nei Nei Ja Nei versjonkom VARCHAR(200) Ja Nei Nei Nei versjonlengde TIME Ja Nei Nei Nei versjonsnutt OID Ja Nei Nei Ja sangid VARCHAR Nei FK Nei Ja PK i sang Moderne Databaseteknologi, Høgskolen i Østfold 2003 11

Hvorfor null/not null og trigger/ikke trigger Kolonne navn Null Check/Trigger id Er PN i tabellen cd. PN kan ikke være null da den unikt skal identifisere hver tuppell. Er av datatypen SERIAL. SERIAL produserer et unikt løpenummer som man ikke trenger å sjekke. versjonutgave versjonkom versjonsnutt sangid Kan ikke være null fordi alle cd-ene våre skal registreres som Studio eller Live. Kan være null fordi ikke alle versjoner har en kommentar. Kan være null fordi det ikke er sikkert at vi har med lydsnutt til alle låter. Kan ikke være null da vi ellers vil miste relasjonen til tabellen sangforfatter. Har med trigger som sjekker om verdiene som legges inn er studio Studio eller live Live. Hvis input starter med liten bokstav gjøres denne om til stor bokstav. Sjekkes ikke fordi den kan være av forskjellig lengde og inneholde forskjellige tegn (tall, bokstaver, symboler) samt at den kan inneholde null-verdi. Sjekkes ikke da den kan inneholde null-verdi PK- og FK-relasjonen sikrer at id i sang må være registrert før den kan registreres her Tabellnavn: sang Kolonne Datatype + Null Nøkkel Check/Trigger Unik Ref(FK) navn lengde id SERIAL Nei PK Nei Ja FK i versjon sangtittel VARCHAR(70) Nei Nei Nei Nei Hvorfor null/not null og trigger/ikke trigger Kolonne navn Null Check/Trigger id Er PN i tabellen cd. PN kan ikke være null da den unikt skal identifisere hver tuppell. Er av datatypen SERIAL. SERIAL produserer et unikt løpenummer som man ikke trenger å sjekke. sangtittel Kan ikke være null fordi alle sanger har en tittel. Sjekkes ikke fordi den kan være av forskjellig lengde og inneholde forskjellige tegn (tall, bokstaver, symboler). Tabellnavn: person Kolonne Datatype + Null Nøkkel Check/Trigger Unik Ref(FK) navn lengde id SERIAL Nei PK Nei Ja enavn VARCHAR(30) Nei Nei Nei Nei fnavn VARCHAR(25) Ja Nei Nei Nei fodselsdato DATE Ja Nei Nei Nei dodsdato DATE Ja Nei Nei Nei nasjonalitet VARCHAR(35) Nei Nei Ja Nei Moderne Databaseteknologi, Høgskolen i Østfold 2003 12

Hvorfor null/not null og trigger/ikke trigger Kolonne navn Null Check/Trigger id Er PN i tabellen cd. PN kan ikke være null da den unikt skal identifisere hver tuppell. Er av datatypen SERIAL. SERIAL produserer et unikt løpenummer som man ikke trenger å sjekke. enavn fnavn fodselsdato dodsdato nasjonalitet Kan ikke være null fordi alle artister har et navn (etternavn eller artistnavn). Kan være null siden alle artister ikke behøver å ha et fornavn (for eksempel Prince). Kan være null fordi det ikke er sikkert at vi kjenner fødselsdato til alle artistene. Kan være null fordi det ikke er sikkert at artisten er død, eller at vi kjenner dens dødsdato. Alle artister har en nasjonalitet som må registreres. Sjekkes ikke fordi den kan være av forskjellig lengde og inneholde forskjellige tegn (tall, bokstaver, symboler). Sjekkes ikke da den kan inneholde null-verdi. Har valgt datatypen DATE. Denne sikrer at fødselsdato blir skrevet inn på riktig format. Har valgt datatypen DATE. Denne sikrer at dødssdato blir skrevet inn på riktig format. Sjekker at nasjonalitet kun består av bokstaver. Tabellnavn: forfatter Kolonne Datatype + Null Nøkkel Check/Trigger Unik Ref(FK) navn lengde id SERIAL Nei PK Nei Ja FK i sangforfatter Hvorfor null/not null og trigger/ikke trigger Kolonne navn Null Check/Trigger id Er PN i tabellen cd. PN kan ikke være null da den unikt skal identifisere hver tuppel Er av datatypen SERIAL. SERIAL produserer et unikt løpenummer som man ikke trenger å sjekke. Tabellnavn: Artist Kolonne Datatype + Null Nøkkel Check/Trigger Unik Ref(FK) navn lengde id SERIAL Nei PK Nei Ja FK i versjoncdartist Hvorfor null/not null og trigger/ikke trigger Kolonne navn Null Check/Trigger id Er PN i tabellen cd. PN kan ikke være null da den unikt skal identifisere hver tuppel Er av datatypen SERIAL. SERIAL produserer et unikt løpenummer som man ikke trenger å sjekke. Moderne Databaseteknologi, Høgskolen i Østfold 2003 13

3.6.2 Svake entiteter Tabellnavn: sangforfatter Kolonne Datatype + Null Nøkkel Check Unik Ref(FK) Navn lengde sangid INT Nei FK PK- og FKrelasjonen Ja PK i sang sikrer at id i sang er registrert før den kan registreres her personid INT Nei FK PK- og FKrelasjonen sikrer at id i forfatter er registrert før den kan registreres her Ja PK i forfatter Hvorfor null/not null og trigger/ikke trigger Kolonne navn Null Check/Trigger sangid Kan ikke være null da vi ellers vil miste relasjonen til tabellen sang. PK- og FK-relasjonen sikrer at id i sang er registrert før den kan registreres her. personid Kan ikke være null da vi ellers vil miste relasjonen til tabellen forfatter. PK- og FK-relasjonen sikrer at id i forfatter er registrert før den kan registreres her. Tabellnavn: versjoncdartist Kolonne Datatype + Null Nøkkel Check/Trigger Unik Ref(FK) navn lengde cdid INT Nei FK Nei Ja PK i cd personid INT Nei FK Nei Ja PK i artist versjonid INT Nei FK Nei Ja PK i versjon hovedbiartist CHAR(1) Nei Nei Ja Nei Hvorfor null/not null og trigger/ikke trigger Kolonne navn Null Check/Trigger cdid Kan ikke være null da vi ellers vil miste relasjonen til tabellen cd. PK- og FK-relasjonen sikrer at id i cd er registrert før den kan registreres her. personid versjonid hovedbiartist Kan ikke være null da vi ellers vil miste relasjonen til tabellen artist. Kan ikke være null da vi ellers vil miste relasjonen til tabellen versjon. Kan ikke være null fordi en artist er enten hoved- eller biartist. PK- og FK-relasjonen sikrer at id i artist er registrert før den kan registreres her. PK- og FK-relasjonen sikrer at id i versjon er registrert før den kan registreres her. Kan kun legge inn H h (hovedartist) eller B b (biartist). Hvis input er liten bokstav gjøres denne om til stor bokstav. Moderne Databaseteknologi, Høgskolen i Østfold 2003 14

3.7 Krav til funksjonalitet/innhold 3.7.1 Arv mellom tabeller: Hvis det er mange objekter som har like attributter kan man ha ett objekt (foreldre objekt) som inneholder alle fellesattributtene. Andre objekter (barne objekter) kan da arve attributtene fra forelderobjektet og tillegg ha sine egne attributter. Ved å gjøre det på denne måten hindrer man at samme data lagres flere steder og at de ikke blir så mange attributter uten verdi. Vi har valgt å ha fellesattributter i objektet person (foreldreobjekt). Objektene artist og forfatter arver attributtene som ligger i objektet person. 3.7.2 OID som datatype: Hver rad i PostgreSQL blir tilegnt et unikt, normalt usynlig tall (OID). Du kan også bruke OID som datatype. Ved å definere OID-kolonner sier man at kolonnene skal inneholde OID-verdier. Vi har valgt å bruke OID som representasjon for bilder (cd-cover i tabellen cd) og lydsnutter (lydspor fra de ulike versjonene i tabellen versjon) i databasen. 3.7.3 Temporale datatyper: Denne datatypen tillater lagring av dato, tid og tidsintervallinformasjon. Formatet som brukes til dato blir kontrollert av settingen i DATESTYLE og formatet til tid blir kontrollert av settingen i TIMESTAMP. Vi har valgt å bruke dato og tid som temporale datatyper: Objektet person har 2 attributter hvor dato brukes, fodselsdato og dodsdato Objektet versjon har 1 attributt hvor tid brukes, versjonlengde. 3.7.4 Array som lagrede verdier: Ved å bruke arrays kan kolonner inneholde flere dataverdier. En array kan brukes til alle datatyper. Hvis du trenger å oppdatere og aksessere elementene i arrayen er det ofte en bedre løsning enten å bruke separate kolonner eller tabeller Hver cd kan inneholde flere kommentarer/anmeldelse. Vi har valgt å legge disse kommentarene/anmeldelsene i en array siden den tillater flere verdier i samme kolonne. Ex. CREATE TABLE test ( name VARCHAR(50), kommentar text[]); INSERT INTO test VALUES ( Tarzan, { Dette er en kommentar, Dette er en annen kommentar }); SELECT kommentar [1:1] FROM test;! Dette er en kommentar SELECT kommentar [1:2] FROM test;! Dette er en kommentar, Dette er en annen kommentar SELECT kommentar [2:2] FROM test;! Dette er en annen kommentar Moderne Databaseteknologi, Høgskolen i Østfold 2003 15

3.7.5 Binary Large Objects som datatype: Du bruker BLOBS som datatype hvis databasen skal ta vare på store dataverdier og/eller binære-data. BLOBS tillater deg å lagre store tekstfiler, lydfiler eller bilder direkte i databasen eller ved å legge pekere til BLOBSene. Tre typer BLOBS er definert: Binary Large Object (BLOB), en binær streng Character Large Object (CLOB), en lang streng med karakterer National Character Large Object (NCLOB), som også er en lang streng med karakterer Vi har valgt å bruke denne datatypen til bilder og lyd: Objektet cd har et attributt, cdbilde og det inneholder et bilde av forsiden til cden. Bildefilene har endelsen.jpg Objektet versjon har et attributt, versjonsnutt og det inneholder en lydsnutt. Lydfilene har endelsen.ra 3.7.6 Funksjoner i form av server side triggers: En trigger er en SQL-kommando som blir utført automatisk av databasen ved forandring på en navngitt tabell. Triggeren blir utført når hendelsen som trigger den blir utført. Triggeren tar ikke imot argumenter. Hendelser som kan utløse en trigger er INSERT, UPDATE og DELETE. Triggerne kan for eksempel brukes for å validere inputdata og for å vedlikeholde komplekse integritetskrav. Vi har brukt triggers for å sjekke om verdien som legges inn i ulike tabeller (enten ved INSERT eller UPDATE) har riktig verdi. Vi trenger ikke å lage triggers til sangforfatter og versjoncdartist da disse kun kan inneholde verdier som allerede ligger i sang, forfatter, versjon, cd eller artist. 3.7.7 Rules: Du bruker rules når man skal kontrollere INSERT, UPDATE og DELETE statements. De er bra å bruke for å kontrollere hva som blir gjort med databasen. Vi har brukt rules som fører en logg over endringer til versjonskommentaren. Det som blir logget er hvem som utfører endringen, når endringen blir gjort samt id og kommentaren. Vi har også laget en regel som kontrollerer at brukeren ikke får slette de 5 første cd-ene i databasen. Moderne Databaseteknologi, Høgskolen i Østfold 2003 16

3.8 CREATE TABLE 3.8.1 Tabellen cd Tabellen cd har 5 attributter. id som er av typen SERIAL er unik og er derfor satt til PN. Cd- titlene er av variabel lengde og vi har derfor valgt å bruke datatypen VARCHAR. Feltet har en maksimallengde på 70 tegn. Siden dette feltet må inneholde en verdi er det spesifisert som NOT NULL. Attributtet cdutaar har en fast lengde på 4 tegn. Har valgt å bruke CHAR og ikke INT siden vi ikke kommer til å benytte attributtet til beregninger. Siden dette feltet må inneholde en verdi er det spesifisert som NOT NULL. VARCHAR [] definere en endimensjonal array. Spesifiserer ikke hvor stor den skal være da det kan være flere kommentarer til hver cd. Attributtet cdbilde er av datatypen BLOB og inneholder en filsti til et bilde. Vi har valgt å bruke OID som representasjon for en BLOB. CREATE TABLE cd ( id SERIAL, cdtittel VARCHAR(70) NOT NULL, cdutaar CHAR(4) NOT NULL, cdkom VARCHAR[], cdbilde OID, PRIMARY KEY (id) ); 3.8.2 Tabellen sang Tabellen sang har 2 attributter. id som er av typen SERIAL er unik og er derfor satt til PN. De ulike sang titlene er av variabel lengde og vi har derfor har vi valgt å bruke datatypen VARCHAR. Feltet har en maksimallengde på 70 tegn. Siden dette feltet må inneholde en verdi er det spesifisert som NOT NULL. CREATE TABLE sang ( id SERIAL, sangtittel VARCHAR(70) NOT NULL, PRIMARY KEY (id) ); 3.8.3 Tabellen versjon Tabellen versjon har 6 attributter. id som er av typen SERIAL er unik og er derfor satt til PN. De to ulike versjonsutgavene som kan registreres har ulike lengder. Vi har derfor valgt å bruke datatypen VARCHAR med en maksimallengde på 6 tegn. En versjon må ha en utgave derfor er feltet spesifisert som NOT NULL. En kommentar til en versjon kan bestå av ulik antall tegn og vi har derfor valgt å bruke datatypen VARCHAR til dette attributtet. Hver kommentar kan maksimalt inneholde 200 tegn. Attributtet versjonlengde inneholder en tidsenhet og vi har derfor valgt en tidsdatatype. Formatet på denne datatypen er timer:minutter:sekunder. Moderne Databaseteknologi, Høgskolen i Østfold 2003 17

Attributtet versjonsnutt er av datatypen BLOB og inneholder en filsti til en lydsnutt. Vi har valgt å bruke OID som representasjon for en BLOB. Attributtet sangid som er FK i denne tabellen er av datatypen INT. Vi har ikke spesifisert noe maksimalgrense siden vi ikke kan vite hvor stor den kan være/vil bli. sangid referere til PN id i tabellen sang. Hvis attributtet id oppdateres/slettes i tabellen sang vil attributtet sangid i tabellen versjon også oppdateres/slettes. CREATE TABLE versjon ( id SERIAL, versjonutgave VARCHAR(6) NOT NULL, versjonkom VARCHAR(200), versjonlengde TIME, versjonsnutt OID, sangid VARCHAR, PRIMARY KEY (id), FOREIGN KEY (sangid) REFERENCES sang(id) ON UPDATE CASCADE ON DELETE CASCADE ); 3.8.4 Tabellen person Tabellen person har 6 attributter. id som er av typen SERIAL er unik og er derfor satt til PN. Ulike artister har variabel lengde på deres etternavn og vi har derfor valgt å bruke datatypen VARCHAR til attributtet enavn. Feltet har en maksimallengde på 35 tegn. Siden dette feltet må inneholde en verdi er det spesifisert som NOT NULL. Ulike artister har variabel lengde på deres fornavn og derfor har vi valgt å bruke datatypen VARCHAR til attributtet fnavn. Feltet har en maksimallengde på 25 tegn. Atributtene fodselsdato og dodsdato består av dato og vi har derfor valgt datatypen Date. Formatet til denne datatypen er dd.mm.yyyy og er satt i settingen DATESTYLE (european). Innholdet i attributtet nasjonalitet vil inneholde verdier av variabel lengde og vi har derfor valgt å bruke datatypen VARCHAR. Feltet har en maksimallengde på 35 tegn. Siden dette feltet må inneholde en verdi er det spesifisert som NOT NULL. CREATE TABLE person ( id SERIAL, enavn VARCHAR(30) NOT NULL, fnavn VARCHAR(25), fodselsdato DATE, dodsdato DATE, nasjonalitet VARCHAR(35) NOT NULL, PRIMARY KEY (id) ); Moderne Databaseteknologi, Høgskolen i Østfold 2003 18

3.8.5 Tabellen forfatter Tabellen forfatter har 1 attributt. id som er av typen SERIAL er unik og er derfor satt til PN. Tabellen forfatter skal arve alle attributtene til tabellen person og dette gjøres ved spesifikasjonen INHERITS(person). CREATE TABLE forfatter ( id SERIAL, PRIMARY KEY (id) )INHERITS (person); 3.8.6 Tabellen artist Tabellen forfatter har 1 attributt. id som er av typen SERIAL er unik og er derfor satt til PN. Tabellen artist skal arve alle attributtene til tabellen person og dette gjøres ved spesifikasjonen INHERITS(person). CREATE TABLE artist ( id SERIAL, PRIMARY KEY (id) ) INHERITS (person); 3.8.7 Tabellen sangforfatter Tabellen forfatter har 2 attributter. Attributtet sangid som er FK i denne tabellen er av datatypen INT. Vi har ikke spesifisert noe maksimalgrense siden vi ikke kan vite hvor stor den kan være/vil bli. Attributtet sangid referere til PN id i tabellen sang. Hvis attributtet id oppdateres/slettes i tabellen sang vil attributtet sangid i tabellen sangforfatter også oppdateres/slettes. Attributtet personid som er FK i denne tabellen er av datatypen INT. Vi har ikke spesifisert noe maksimalgrense siden vi ikke kan vite hvor stor den kan være/vil bli. personid referere til PN id i tabellen forfatter. Hvis attributtet id oppdateres/slettes i tabellen forfatter vil attributtet personid i tabellen sangforfatter også oppdateres/slettes. CREATE TABLE sangforfatter ( sangid INT, personid INT, FOREIGN KEY (sangid) REFERENCES sang(id) ON UPDATE CASCADE ON DELETE CASCADE, FOREIGN KEY (personid) REFERENCES forfatter(id) ON UPDATE CASCADE ON DELETE CASCADE ); 3.8.7 Tabellen versjoncdartist Tabellen versjoncdartist har 4 attributter. Attributtet cdid som er FK i denne tabellen er av datatypen INT. Vi har ikke spesifisert noe maksimalgrense siden vi ikke kan vite hvor stor den kan være/vil bli. cdid referere til PN id i tabellen cd. Hvis attributtet id oppdateres/slettes i tabellen cd vil attributtet cdid i tabellen versjoncdartist også oppdateres/slettes. Moderne Databaseteknologi, Høgskolen i Østfold 2003 19

Attributtet versjonid som er FK i denne tabellen er av datatypen INT. Vi har ikke spesifisert noe maksimalgrense siden vi ikke kan vite hvor stor den kan være/vil bli. versjonid referere til PN id i tabellen versjon. Hvis attributtet id oppdateres/slettes i tabellen versjon vil attributtet versjonid i tabellen versjoncdartist også oppdateres/slettes. Attributtet personid som er FK i denne tabellen er av datatypen INT. Vi har ikke spesifisert noe maksimalgrense siden vi ikke kan vite hvor stor den kan være/vil bli. personid referere til PN id i tabellen artist. Hvis attributtet id oppdateres/slettes i tabellen artist vil attributtet personid i tabellen versjoncdartist også oppdateres/slettes. Attributtet hovedbiartist har en fast lengde på 1 tegn, H h eller B b. En versjon må ha en hovedartist derfor er feltet spesifisert som NOT NULL. CREATE TABLE versjoncdartist ( cdid INT, versjonid INT, personid INT, hovedbiartist CHAR(1) NOT NULL, FOREIGN KEY (cdid) REFERENCES cd(id) ON UPDATE CASCADE ON DELETE CASCADE, FOREIGN KEY (versjonid) REFERENCES versjon(id) ON UPDATE CASCADE ON DELETE CASCADE, FOREIGN KEY (personid) REFERENCES artist(id) ON UPDATE CASCADE ON DELETE CASCADE ); 3.8.7 Tabellen versjonkom_log Oppretter tabellen versjonkom_log med 4 attributter. id blir automatisk unik og er derfor satt til PN. En kommentar til en versjon kan bestå av ulik antall tegn og vi har derfor valgt å bruke datatypen VARCHAR til dette attributtet. Hver kommentar kan maksimalt inneholde 200 tegn. Attributtet log_hvem vil inneholde tekst med variabel lengde og vi har derfor valgt datatypen TEXT. Attributtet log_tid skal inneholde tidspunktet der og da og det var da naturlig å bruke TIMESTAMP. CREATE TABLE versjonkom_log ( id SERIAL, versjonkom VARCHAR (200), log_hvem TEXT, log_tid TIMESTAMP, PRIMATY KEY (id) ); Moderne Databaseteknologi, Høgskolen i Østfold 2003 20

3.9 Server-side trigger funksjoner 3.9.1 På tabellen cd Denne TRIGGER-funksjonen skal sikre at når du oppdaterer eller setter inn verdier i attributtet cdutaar i tabellen cd, så kan verdien kun består av tall mellom 1965 og dagens dato. Funksjonen heter trigger_insert_update_cd. Den første IF-testen sjekker om attributtet cdutaar inneholder andre tegn enn tall. Hvis IF-testen slår til skrives det ut Årstallet kan kun bestå av tall. Den andre IF-testen sjekker om attributtet cdutaar er mindre enn 1965 eller større en dagens dato. Hvis IF-testen slår til skrives det ut Årstallet må være fra 1965 frem til året i år.. Språket som brukes er plpgsql. CREATE FUNCTION trigger_insert_update_cd() RETURNS opaque AS 'BEGIN IF new.cdutaar!~ ''^[0-9][0-9][0-9][0-9]$'' THEN RAISE EXCEPTION ''Årstallet kan kun bestå av tall.''; END IF; IF new.cdutaar NOT BETWEEN 1965 AND CURRENT_DATE THEN RAISE EXCEPTION ''Årstallet må være fra 1965 frem til året i år.''; END IF; RETURN new; END;' LANGUAGE 'plpgsql'; Oppretter TRIGGER som heter trigger_statement_cd. Denne TRIGGER kjøres før du kan sette inn eller oppdatere rader i tabellen cd. Kaller funksjonen trigger_insert_update_cd(). CREATE TRIGGER trigger_statement_cd BEFORE INSERT OR UPDATE ON cd FOR EACH ROW EXECUTE PROCEDURE trigger_insert_update_cd(); Test INSERT INTO cd (cdtittel, cdutaar, cdkom, cdbilde) VALUES('Unplugged','t195','{"Loep aa kjøp"}', lo_import('/home/studenter/it00/kjellggu/database2003/blobs/bilder/unplugged_n eil.jpg')); ERROR: Årstallet kan kun bestå av tall. Test INSERT INTO cd (cdtittel, cdutaar, cdkom, cdbilde) VALUES('Unplugged','1950','{"Loep aa kjøp"}', lo_import('/home/studenter/it00/kjellggu/database2003/blobs/bilder/unplugged_n eil.jpg')); ERROR: ''Årstallet må være fra 1965 frem til året i år Moderne Databaseteknologi, Høgskolen i Østfold 2003 21

3.9.2 På tabellen versjon Denne TRIGGER-funksjonen skal sikre at når du oppdatere eller setter inn verdier i attributtet versjonutgave i tabellen versjon, så kan verdien kun bestå av S studio eller L live. Funksjonen heter trigger_insert_update_versjon. IF-testen sjekker om attributtet cdutaar inneholder andre ting enn S studio eller L live. Hvis IF-testen slår til skrives det ut ''Kan kun ha disse 2 utgavene, studio eller live.. initcap setter stor forbokstav. Språket som brukes er plpgsql. CREATE FUNCTION trigger_insert_update_versjon() RETURNS opaque AS 'BEGIN IF new.versjonutgave!~ ''[Ss]tudio [Ll]ive'' THEN RAISE EXCEPTION ''Kan kun ha disse 2 utgavene, studio eller live.''; END IF; new.versjonutgave = initcap(new.versjonutgave); RETURN new; END;' LANGUAGE 'plpgsql'; Oppretter TRIGGER som heter trigger_statement_versjon. Denne TRIGGER kjøres før du kan sette inn eller oppdatere rader i tabellen versjon. Kaller funksjonen trigger_insert_update_versjon(). CREATE TRIGGER trigger_statement_versjon BEFORE INSERT OR UPDATE ON versjon FOR EACH ROW EXECUTE PROCEDURE trigger_insert_update_versjon(); Test INSERT INTO versjon (versjonutgave, versjonkom, versjonlengde, versjonsnutt, sangid) VALUES('Remix','','3:05','',70); ERROR: Kan kun ha disse 2 utgavene, studio eller live. Moderne Databaseteknologi, Høgskolen i Østfold 2003 22

3.9.3 På tabellen forfatter og artist Denne TRIGGER-funksjonen skal sikre at når du oppdatere eller setter inn verdier i attributtet nasjonalitet i tabellene artist og forfatter, så kan verdien kun inneholde bokstaver. Funksjonen heter trigger_insert_update_forfatterartist. IF-testen sjekker om attributtet nasjonalitet inneholder andre ting enn bokstaver. Hvis IF-testen slår til skrives det ut ''Nasjonalitet kan kun inneholde bokstaver.''. Språket som brukes er plpgsql. CREATE FUNCTION trigger_insert_update_forfatterartist() RETURNS opaque AS 'BEGIN IF new.nasjonalitet!~ ''^[A-Za-z]*$'' THEN RAISE EXCEPTION ''Nasjonalitet kan kun inneholde bokstaver.''; END IF; RETURN new; END;' LANGUAGE 'plpgsql'; Oppretter TRIGGERE som heter trigger_statement_ forfatter / trigger_statement_artist. Disse TRIGGERE kjøres før du kan sette inn eller oppdatere rader i tabellen forfatter / artist. Kaller funksjonen trigger_insert_update_forfatterartist(). CREATE TRIGGER trigger_statement_forfatter BEFORE INSERT OR UPDATE ON forfatter FOR EACH ROW EXECUTE PROCEDURE trigger_insert_update_forfatterartist(); CREATE TRIGGER trigger_statement_artist BEFORE INSERT OR UPDATE ON artist FOR EACH ROW EXECUTE PROCEDURE trigger_insert_update_forfatterartist(); Test Tabellen artist INSERT INTO artist (enavn, fnavn, fodselsdato, dodsdato, nasjonalitet) VALUES('Pickett','Wilson','18.03.1941', null,'1938'); ERROR: Nasjonalitet kan kun inneholde bokstaver. Tabellen forfatter INSERT INTO forfatter (enavn, fnavn, fodselsdato, dodsdato, nasjonalitet) VALUES('Gates','Adam','21.10.1941', null,'2i01'); ERROR: Nasjonalitet kan kun inneholde bokstaver. Moderne Databaseteknologi, Høgskolen i Østfold 2003 23

3.9.4 På tabellen versjoncdartist Denne TRIGGER-funksjonen skal sikre at når du oppdatere eller setter inn verdier i attributtet hovedbiartist i tabellen versjoncdartist, så kan kun verdien inneholde H h eller B b. Funksjonen heter trigger_insert_ update_versjoncdartist. IF-testen sjekker om attributtet hovedbiartist inneholder andre ting enn bokstavene H h og B b. Hvis IF-testen slår til skrives det ut ''HovedBiArtist skal enten inneholde H eller B.''. upper setter stor bokstav. Språket som brukes er plpgsql. CREATE FUNCTION trigger_insert_update_versjoncdartist() RETURNS opaque AS 'BEGIN IF new.hovedbiartist!~ ''[Hh] [Bb]$'' THEN RAISE EXCEPTION ''HovedBiArtist skal enten inneholde H eller B.''; END IF; new.hovedbiartist = upper(new.hovedbiartist); RETURN new; END;' LANGUAGE 'plpgsql'; Oppretter TRIGGERE som heter trigger_statement_versjoncdartist. Denne TRIGGER kjøres før du kan sette inn eller oppdatere rader i tabellen versjoncdartist. Kaller funksjonen trigger_insert_update_versjoncdartist (). CREATE TRIGGER trigger_statement_versjoncdartist BEFORE INSERT OR UPDATE ON versjoncdartist FOR EACH ROW EXECUTE PROCEDURE trigger_insert_update_versjoncdartist(); Test INSERT INTO versjoncdartist (cdid, versjonid, personid, hovedbiartist) VALUES(2,17,4,'S'); ERROR: HovedBiArtist skal enten inneholde H eller B. Moderne Databaseteknologi, Høgskolen i Østfold 2003 24

3.9.5 Check-statements Istedenfor å lage triggers kan man også legge inn checkstatements i CREATE TABLE. Utdrag av de ulike CREATE TABLE statementene Lager en CHECK som sjekker om innholdet i attributtet cdutaar i tabellen cd ligger mellom 1965 og dagens dato. CREATE TABLE cd ( cdutaar CHAR(4) NOT NULL CHECK (cdutaar BETWEEN '1965' AND CURRENT_DATE), ); Lager en CHECK som sjekker om innholdet i attributtet versjonutgave i tabellen versjon består av enten Studio eller Live. CREATE TABLE versjon ( versjonutgave CHAR(6) NOT NULL CHECK (versjonutgave IN ('Studio', 'Live'), ); Lager en CHECK som sjekker om innholdet i attributtet hovedbiartist i tabellen versjoncdartist består av enten H eller B. CREATE TABLE versjoncdartist (. hovedbiartist CHAR(1) NOT NULL CHECK (hovedbiartist IN ('H', 'B') ); Moderne Databaseteknologi, Høgskolen i Østfold 2003 25

3.10 Utdrag fra DROP FUNCTION, TRIGGER, TABLE, SEQUENCE og RULES Under har vi tatt med noen eksempler på DROP statements som sletter ulikt innhold i databasen. Her slettes spesifisert funksjon og trigger. ON cd spesifiserer at triggeren er opprettet mot tabellen cd. - DROP FUNCTION trigger_insert_update_cd(); - DROP TRIGGER trigger_statement_cd ON cd; Under slettes tabellene sangforfatter og sang. Hvis det er to tabeller som er koblet sammen med PN og FN må man slette tabellen med PN først. DROP table sangforfatter; DROP table sang; Sekvensene som blir opprettet når man benytter datatypen SERIAL må slettes manuelt etter at tabellene er slettet. - DROP SEQUENCE sang_id_seq; Sletter regelene versjonkom_regel og beskytt_cd. - DROP RULE versjonkom_regel; - DROP RULE beskytt_cd; Moderne Databaseteknologi, Høgskolen i Østfold 2003 26

4. Utdrag over innholdet i tabellene 4.1 Tabellen cd Setter inn verdier i attributtene cdtittel, cdutaar, cdkom og cdbilde i tabellen cd. Tabellen har også atributtet id, men id har datatype SERIAL og får automatisk tildelt en verdi. Verdien til cdkom må skrives inne i { } siden datatypen til cdkom er en array. Verdien til cdbilde er en filsti som spesifisere hvor bildet ligger. INSERT INTO cd (cdtittel, cdutaar, cdkom, cdbilde) VALUES('Tapestry','1971','{"Rock pa sitt beste", "Denne må du høre"}', lo_import('/home/studenter/it00/kjellggu/database2003/blobs/bilder/tapestry.jpg' )); INSERT INTO cd (cdtittel, cdutaar, cdkom, cdbilde) VALUES('Unplugged','1993','{"Loep aa kjøp"}', lo_import ('/home/studenter/it00/kjellggu/database2003/blobs/bilder/unplugged_neil.jpg')); 4.2 Tabellen sang Setter inn verdier i attributtet sangtittel i tabellen sang. Tabellen har også atributtet id, men id har datatype SERIAL og får automatisk tildelt en verdi. INSERT INTO sang (sangtittel) VALUES('I Feel the Earth Move'); INSERT INTO sang (sangtittel) VALUES('So Far Away'); 4.3 Tabellen versjon Setter inn verdier i attributtene versjonutgave, versjonkom, versjonlengde, versjonsnutt og sangid i tabellen versjon. Tabellen har også atributtet id, men id har datatype SERIAL og får automatisk tildelt en verdi. Verdien til versjonlengde innholder en tidsenhet skilt med : (2 minutter:58 sekunder). Verdien til versjonsnutt er en filsti som spesifiserer hvor lydklippet ligger. INSERT INTO versjon (versjonutgave, versjonkom, versjonlengde, versjonsnutt, sangid) VALUES ('studio','','2:58',lo_import('/home/studenter/it00/kjellggu/ database2003/blobs/lyd/carole_king_i_feel_the_earth_move.ra'),1); INSERT INTO versjon (versjonutgave, versjonkom, versjonlengde, versjonsnutt, sangid) VALUES('Studio','','3:55',lo_import('/home/studenter/it00/kjellggu/database2003/ blobs/lyd/carole_king_so_far_away.ra'),2); Moderne Databaseteknologi, Høgskolen i Østfold 2003 27

4.4 Tabellen forfatter Setter inn verdier i attributtene enavn, fnavn, fodselsdato, dodsdato og nasjonalitet i tabellen forfatter. Tabellen har også atributtet id, men id har datatype SERIAL og får automatisk tildelt en verdi. Verdien til fodselsdato innholder en tidsenhet skilt med punktum (dd.mm.åååå). INSERT INTO forfatter (enavn, fnavn, fodselsdato, dodsdato, nasjonalitet) VALUES('King','Carole','09.02.1942', null,'usa'); INSERT INTO forfatter (enavn, fnavn, fodselsdato, dodsdato, nasjonalitet) VALUES('Wexler','Dan','01.01.1978', null,'kanada'); 4.5 Tabellen artist Setter inn verdier i attributtene enavn, fnavn, fodselsdato, dodsdato og nasjonalitet i tabellen artist. Tabellen har også atributtet id, men id har datatype SERIAL og får automatisk tildelt en verdi. Verdien til fodselsdato innholder en tidsenhet skilt med punktum (dd.mm.åååå). INSERT INTO artist (enavn, fnavn, fodselsdato, dodsdato, nasjonalitet) VALUES('King','Carole','09.02.1942', null,'usa'); INSERT INTO artist (enavn, fnavn, fodselsdato, dodsdato, nasjonalitet) VALUES('Wexler','Dan','01.01.1978', null,'kanada'); 4.6 Tabellen versjoncdartist Setter inn verdier i attributtene cdid, versjonid, personid og hovedbiartist i tabellen versjoncdartist. INSERT INTO versjoncdartist (cdid, versjonid, personid, hovedbiartist) VALUES (1,1,1,'H'); INSERT INTO versjoncdartist (cdid, versjonid, personid, hovedbiartist) VALUES(1,2,1,'H'); 4.7 Tabellen sangforfatter Setter inn verdier i attributtene sangid og personid i tabellen sangforfatter. INSERT INTO sangforfatter (sangid, personid) VALUES(1,1); INSERT INTO sangforfatter (sangid, personid) VALUES(2,1); Moderne Databaseteknologi, Høgskolen i Østfold 2003 28

5. Rules Som tidligere nevnt i oppgaven (kapitel 3.7.7) fungerer regler (rules) fint når man skal kontrollere hva som blir gjort med databasen. Vi har lagd en regel som fører en logg over endringer til versjonskommentarer. Det som blir logget er hvem som utfører endringen, når endringen blir gjort samt ID og kommentaren. Kort beskrivelse av funksjonalitet: - AS ON UPDATE TO -> Hvis versjon blir oppdatert så blir regelen kjørt - WHERE -> Kontrollerer at den gamle versjonskommentaren ikke er lik den nye versjonskommentaren - DO INSERT INTO -> Legger de nye verdiene inn i loggen - VALUES (New.id ) -> Det er disse verdiene som blir lagt inn i loggen CREATE RULE versjonkom_regel AS ON UPDATE TO versjon WHERE NEW.versjonKom!= OLD.versjonKom DO INSERT INTO versjonkom_log VALUES ( NEW.id, NEW.versjonKom, current_user, current_timestamp ); Under har vi laget en regel som kontrollerer at brukeren ikke får slette de 5 første cd-ene i databasen. Dette er ingen nyttig funksjon i vår database, men bare et eksempel på hvilke muligheter man har med regler i postgresql. Kort beskrivelse av funksjonalitet: - DO INSTEAD -> Hvis id er mindre enn 5, så blir det skrevet ut UPDATE 0 (ikke oppdatert). Hvis ID er større enn 5 så skrives det ut UPDATE 1 (oppdatert) CREATE RULE beskytt_cd AS ON UPDATE TO cd WHERE old.id < 5 DO INSTEAD nothing; Moderne Databaseteknologi, Høgskolen i Østfold 2003 29

6. SQL spørringer Under har vi tatt med et utvalg spørringer for å vise databasens funksjonalitet. Vi starter med noen enkle spørringer på enkle tabeller, for så å ta med noen spørringer med noe mer kompleks funksjonalitet. 1. Skriv ut alle cd-er i databasen. En enkel spørring som egentlig ikke inneholder funksjonalitet som behøver å forklares nærmere. Tegnet * er synonymt med ALL. Ved å bruke tegnet * får vi ut alle kolonnenavnene. Innholdet i arrayen blir presentert i klammene { } og cdbilde viser OID til hvert bilde. SELECT * FROM cd; id cdtittel cdutaar cdkom cdbilde --+----------------------------+ --------------+--------------------------------------------------------+---------- 1 Tapestry 1971 {"Rock pa sitt beste","denne må du høre"} 46075 2 Unplugged 1993 {"Loep aa kjøp"} 46077 3 Rust Never Sleeps 1967 {Yeah,"Mye musikk for få penger"} 46079 4 Greatest Hits 1976 {"La oss danse","la oss rocke"} 46081 5 Live at the Fillmore West 1971 {"Hennes beste","ikke verd penger"} 46083 6 Tom Jones Hits 2000 {"Tom Jones på sitt verste","sure penger"} 46085 Moderne Databaseteknologi, Høgskolen i Østfold 2003 31

2. Skriv ut alle artister i databasen. Spørring som viser arv mellom tabeller. Det er kun attributtet id som ligger i tabellen artist. Resten av attributtene arves fra tabellen person. SELECT * FROM artist; id enavn fnavn fodselsdato dodsdato nasjonalitet --- +----------+-------------+---------------+---------------------+-------------- 1 King Carole 1942-09-02 USA 2 Wexler Dan 1978-01-01 Kanada 3 Sky Amy 1946-09-02 USA 4 Young Neil 1945-12-11 Kanada 5 Larson Nicolette 1952-07-17 USA 6 Osborne Joe 1937-07-28 USA 7 Pickett Wilson 1941-03-18 USA 8 Womack Aaron 1959-08-09 England 9 Leakes Jerry 1943-06-07 USA 10 Moore Brew 1924-03-26 1973-09-19 USA 11 Drayton Charley 1944-06-03 England 12 Turner Hughes 1951-10-11 USA 13 Franklin Aretha 1942-03-25 USA 14 Charles Ray 1930-09-23 USA 15 Jones Tom 1940-07-06 England 16 Spector Phil 1940-12-26 USA 17 Mann Barry 1939-09-02 USA 18 Knight Gladys 1944-05-28 USA Moderne Databaseteknologi, Høgskolen i Østfold 2003 32

3. Skriv ut alle sangforfattere i databasen. Spørring lik den i forrige eksempel, det vil si viser arv mellom tabellene forfatter og person. SELECT * FROM forfatter; id enavn fnavn fodselsdato dodsdato nasjonalitet ----+-----------------+--------------+---------------+--------------------+-------------- 1 King Carole 1942-09-02 USA 2 Wexler Dan 1978-01-01 Kanada 3 Young Neil 1945-12-11 Kanada 4 Pickett Wilson 1941-03-18 USA 5 Kenner Chris 1929-12-25 1976-01-25 USA 6 Russell Alan 1956-09-19 USA 7 Field Rice 1955-12-17 England 8 Adams Christian 1950-10-11 USA 9 Womack Aaron 1959-08-09 England 10 Collins Allen 1952-07-19 1990-01-23 USA 11 Browne Jackson 1948-09-10 Tyskland 12 McCartney Paul 1942-06-18 England 13 Holland Adam 1947-05-06 England 14 Andy Kim 1946-05-12 Kanada 15 Bellman David 1945-01-09 Skottland 16 Huff Bill 1949-02-02 Kanada 17 Shapiro Ben 1953-12-26 USA 18 Newman Andy 1943-02-16 USA 19 West David 1943-08-17 England 20 Sanders Adams 1948-02-16 Kanada 21 Franklin Aretha 1942-03-25 USA 22 Redding Otis 1941-09-09 1967-10-12 USA 23 Stills Stephen 1944-12-09 USA 24 Simon Paul 1941-10-13 USA 25 Gates Adam 1941-10-21 USA 26 Ertegun Ahmet 1927-05-27 Tyrkia 27 Simpson Ray 1941-09-02 USA 28 Jones Tom 1940-07-06 England 29 Anka Paul 1941-07-30 Kanada 30 Rabbitt Eddie 1941-11-27 1998-07-05 USA 31 Reed Lou 1942-02-03 USA 4. Hvor mange cd-er finnes i databasen? Enkel spørring som teller antall cd-er i databasen ved hjelp av aggregate funksjonen COUNT. Nøkkelordet AS gjør det mulig å bestemme navnet på egne overskrifter, her antallcd SELECT count(id) AS antallcd FROM cd; antallcd ---------- 6 Moderne Databaseteknologi, Høgskolen i Østfold 2003 33

5. List alle cd-ene sortert på tittel Spørring som lister ut alle cd-titlene i databasen sortert stigende (default) ved hjelp av funksjonen ORDER BY. Det er kun mulig å bruke ORDER BY på kolonner som er spesifisert i SELECT, her cdtittel. SELECT cdtittel AS Tittel from cd ORDER BY cdtittel; tittel --------------------------- Greatest Hits Live at the Fillmore West Rust Never Sleeps Tapestry Tom Jones Hits Unplugged 6. Hvilke cd-er ble gitt ut i 1976? Finner cd-er utgitt i 1976 ved hjelp av WHERE. SELECT cdtittel FROM cd WHERE cdutaar = '1976'; cdtittel --------------- Greatest Hits 7. Hvilke cd-er ble gitt ut i perioden 1990-1995? Spørring som gir alle cd-er som er gitt ut fra og med 1990 til og med 1995. Bruker BETWEEN for å få til dette. SELECT cdtittel FROM cd WHERE cdutaar BETWEEN '1990' AND 1995 ; cdtittel ----------- Unplugged Moderne Databaseteknologi, Høgskolen i Østfold 2003 34

8. Hvilke låter har lengde på mer enn 5 minutter? Vår første spørring der vi joiner to tabeller (sang og versjon) for å få frem ønsket informasjon. Setter alias til begge tabellene, s til sang og v til versjon. Disse aliasene brukes for å få en enklere og renere syntaks. WHERE sjekker at id i tabellene sang (s) og versjon (v) er den samme. Dette gjøres for å få frem korrekt resultat og for å unngå og få kartesisk produkt. SELECT sangtittel, versjonlengde FROM sang s, versjon v WHERE s.id = v.sangid AND v.versjonlengde > '05:00'; sangtittel versjonlengde ----------------------------------------------+------------------ You have Got a Friend 05:09:00 The Old Laughing Lady 05:15:00 Pocahontas 05:06:00 Helpless 05:48:00 Harvest Moon 05:20:00 Look Out for My Love 05:57:00 Long May You Run 05:22:00 From Hank to Hendrix 05:51:00 Thrasher 05:38:00 Powderfinger 05:30:00 Hey Hey My My (Into the Black) 05:18:00 Get Me Back on Time, Engine Number 9 06:23:00 9. Hvor mange låter har Neil Young sunget? I denne spørringen må vi ha to joins for å få korrekt resultat. Tabellene cd og artist ligger på hver sin side av den svake entiteten versjoncdartist (vca). vca er kun med i databasen for å unngå mange til mange forhold mellom cd og artist (samt versjon). SELECT count(cdid) AS Antall FROM cd, versjoncdartist vca, artist a WHERE a.fnavn = 'Neil' AND a.enavn = 'Young' AND cd.id = vca.cdid AND vca.personid = a.id; antall -------- 22 Moderne Databaseteknologi, Høgskolen i Østfold 2003 35