FÖ 5: Databaskursen 1 1. SQL DML (Data Manipulation Language) 2. Lägga till data 3. Kopiera tabell 4. Uppdatera data 5. Aktivera default value 6. Hantera datum 7. Ta bort data 8. SQL TCL (Transaction Control Language) 9. Samtidighet 10. Databastransaktion 11. Commit och rollback 12. Sessioner 13. ACID properties 14. Lås Pär Douhan, pdo@du.se
SQL - DML Vi börjar med SQL - DML 2
SQL DML Förkortningen DML står för Data Manipulation Language Används när vi ska lägga till, uppdatera eller ta bort dt data från få en tabell. Vi påverkar alltså innehållet i tabeller med DML. TABELL kolumn1 kolumn2 kolumn3 1. Lägga till: insert 2. Uppdatera: update 3. Ta bort: delete Tabellen innehåller data i form av rader. Det är raderna vi skapar, uppdaterar och tar bort med DML. 3
Fylla på data När vi ska fylla på en databastabell med data kan vi göra det på lite olika sätt. Här kommer några exempel: 1. Lägga till nya rader med insert 2. Fylla på en tabell med data från en annan tabell 3. Fylla på en tabell eller flera tabeller med data från en extern fil 4
Datafångst t Webbläsaren är ett vanligt gränssnitt för att lägga in ny data. Ofta kommer data som matas in i databasen från olika typer av webbformulär. Detta sker om du t. ex. lägger in en annons på Blocket eller gör ett besök hos din internetbank och betalar räkningar eller så besvarar du kanske en webbenkät. Innehållet i ditt webbformulär skickas k till webbservern som via olika drivrutiner ODBC, OLEDB eller kanske JDBC tillsammans med PHP,.NET eller JSP ansluter till databasen och exekverar en SQL-sats som lägger in, i detta exempel, annonsens data i databasen. I andra fall kanske data kommer från andra databaser i form av XML-filer eller vanliga textfiler (CSV-filer). Datan i dessa filer kan laddas in i databasen med olika verktyg, t. ex. Oracle SQL Loader. Excel-filer är en annan vanlig källa för data. Datainnehållet i excel-filer går också att ladda in en databas, ofta exporterar man innehållet i excel-filen till en s.k. csv-fil, som är en vanlig textfil, innan man laddar in data i databasen. 5
SQL Loader DB ETL, ExtractTransform Load Data XML CSV EXCEL LOG SQL Loader Data DB 6
Lägga till data med insert KUND # knr * persnr * fnamn * enamn * regdatum KUND knr persnr fnamn enamn regdatum 1 840315-7415 Erik Ek 20170101 2 870201-5510 arman ikovic 20170101 3 745022 karin ander 20170101 insert into kund(knr,persnr,fnamn,enamn,regdatum) values(seq_knr.nextval,'840315-7415','erik','ek',sysdate); insert into kund(knr,persnr,fnamn,enamn,regdatum) enamn regdatum) values(seq_knr.nextval,'870201-5510','arman','ikovic',sysdate); insert into kund(knr,persnr,fnamn,enamn,regdatum) enamn regdatum) values(seq_knr.nextval,750610-5588,'karin','ander',sysdate); 7 Om vi glömmer fnuttar ' ' runt persnr, så kommer Oracle att ta 750610 minus 5588 och typomvandla till varchar2
Hämta data från en annan tabell BIL # regnr * färg * märke * modell o hk Data SPORTBIL # regnr * färg * märke * modell o hk Uppgift: Fyll på tabellen Sportbil med data från tabell Bil. insert into sportbil(regnr,färg,märke,modell,hk) select regnr,färg,märke,modell,hk from bil; Eller så här (* står för alla kolumner): insert into sportbil select * from bil; 8
Kopiera en tabell med eller utan data BIL # regnr * färg * märke * modell o hk SPORTBIL # regnr * färg * märke * modell o hk Uppgift: Skapa tabellen Sportbilar som en kopia av tabellen Bilar. Ta bara med bilobjekt som har mer än 400 hk. create table sportbil as select * from bilar where hk > 400; Tabellen Sportbil skapas som en kopia av tabellen Bil. Data och not null constraints följer med. Det som inte följer med är: create table bil2 as select * from bil where 3 = 4; Tabellen Bil2 skapas som en kopia av tabellen Bil. OBS! Ingen data följer med. Detta då villkoret: 3 = 4 aldrig blir sant. 9 PK, FK, Check och Unique
Uppdatera en rad KUND # knr * persnr * fnamn * enamn * regdatum KUND knr persnr fnamn enamn regdatum 1 840315-7415 Erik Ek 20170101 2 870201-5510 arman ikovic 20170101 3 745022 750610-5588 karin ander 20170101 Uppgift: Rätta till det felaktiga personnumret från tidigare exempel. Vi gör detta genom att uppdatera cellen som innehåller persnr 745022 för kund med knr = 3. update kund set persnr = '750610-5588' where knr = 3; 10 Detta kallas för en singleton update. Detta då det bara är en rad som påverkas.
Aktivera default value KUND Hur gör vi för att aktivera default value till kolumnen regdatum? # knr * persnr * fnamn * enamn * regdatum Deklarerad som: regdatum date default sysdate not null, Om vi utelämnar kolumnen regdatum i vår insert-sats, så kommer Oracle att aktivera default value för kolumnen. insert into kund(knr,persnr,fnamn,enamn) values(seq q_ knr.nextval,'721111-5542','rolf','ek');,, 11
Lägga in datum KUND # knr * persnr * fnamn * enamn * regdatum KUNDORDER # id (#) knr * orderdatum * levdatum Vi lägger till en rad i tabellen Kundorder. Orderdatum är sysdate och levdatum blir om 4 dagar. Hur gör vi? insert into kundorder(id,knr,orderdatum,levdatum) values(seq_radnr.nextval,'2559',sysdate,sysdate + 4); date + number = date 12
Lägga in datum Studera! insert into kundorder(id,knr,orderdatum,levdatum) values(x.nextval,3,sysdate,to_date('2018-10-28','yyyy-mm-dd')); l t t d t ('2018 10 28' 'YYYY orderdatum = 2018-10-24:14:30:01 levdatum = 2018-10-28:00:00:0010 28 00 00 00 Varför? insert into tabell(id,knr,orderdatum,levdatum) values(x.nextval,3,sysdate,to_date('2018-10-28:14:10','yyyy-mm-dd:hh24:mi')); 13 Vi måste sätta finkornigheten själva med hjälp av önskad formatmask för datumsträngen.
Uppdatera flera rader ARTIKEL # artnr * artnamn * lagerplats * lagerantal * pris Det kommer att bli en stor mellandagsrea. Vi ska därför sänka priset på alla våra artiklar med 30%. update artikel set pris = (pris * 0.7); Om vi inte har något where-villkor, så kommer alla rader att påverkas. update artikel set pris = (pris * 0.7) where lagerantal < 20; Om vi har ett where-villkor som inte inkluderar en primärnyckel eller annan kolumn som är unik, så kan vi påverka en eller flera rader med vår SQL-sats. 14
Uppdatera flera kolumner KUND # knr * persnr * fnamn * enamn * adress * postnr * ort * email * regdatum En kund loggar in på sitt konto för att uppdatera sina kunduppgifter med sin nya adress. Följande SQL-sats måste exekveras för att uppgifterna ska ändras: update kund set adress = 'Hemgatan 12', postnr = 84523, ort = 'Mora' where knr = 12568; 15
Ta bort en rad KUND # knr * persnr * fnamn * enamn * regdatum KUNDORDER # id (#) knr * orderdatum * levdatum Vi vill ta bort kund med knr = 3 från tabellen kund: delete from kund where knr = 3; Error at line 1: ORA-02292: brott mot integr.begränsning (TEST.KUNDORDER_KNR_FK) - underordnad post påträffad. Kunden äger en eller flera kundordrar. Referensintegriteten FK ser till att detta stoppas. 16
Tömma tabellerna på data KUND # knr * persnr * fnamn * enamn * regdatum KUNDORDER # id (#) knr * orderdatum * levdatum Om vi vill tömma bägge tabellerna på data gör vi följande: delete from kundorder; delete from kund; commit; Töm tabellerna i rätt ordning. Avsluta alla lyckade transaktioner med commit! 17
Labbrapport Hur redovisa labben? 18
Läsbar kod är viktigt! t! create table KUND ( persnr varchar2(11), username varchar2(12) not null, passwd varchar2(12) not null, fnamn varchar2(40) not null, enamn varchar2(60) not null, kredittyp varchar2 (12) not null, telnr varchar2(14) ); Vilken kod är mest lättläst? kredittyp varchar2 (12) not null Borde vara denna :) create table KUND ( persnr varchar2(11), username varchar2(12) not null, passwd varchar2(12) not null, fnamn varchar2(40) not null, enamn varchar2(60) not null, kredittyp varchar2 (12) not null, telnr varchar2(14) ); create table KUND ( persnr varchar2(11), username varchar2(12) not null, passwd varchar2(12) not null, fnamn varchar2(40) not null, enamn varchar2(60) not null, kredittyp varchar2 (12) not null, telnr varchar2(14) ); 19
Gruppera det som hör ihop Skriv en välstrukturerad, tydlig och lättläst labbrapport! Uppgift x: Skapa tabeller -- Tabell KUND -- create table kund( knr number(6), fnamn varchar2(50) not null, kredittyp varchar2(5)); alter table kund add constraint kund_kr_pk primary key(knr) add constraint kund_kreditvärdighet_ck check(kredittyp in('hög','medel','låg')); -- Tabell KUNDORDER -- Definitioner -- Tabell x -- Definitioner 20
SQL - TCL Vi fortsätter med SQL - TCL 21
SQL DML Förkortningen TCL står för Transaction Control Language Används när vi ska påverka effekterna av en transaktion (T). En T skapas av DML, d.v.s. när vi gör insert, update eller delete mot en tabell. TABELL kolumn1 kolumn2 kolumn3 1. Spara effekter av T: commit 2. Ångra effekter av T: rollback När vi påverkar datainnehållet i en tabell med DML, så skapas en transaktion. En T kommer alltid att förändra datainnehållet i tabellen. 22
Samtidighet t Klienter Webbserver och klient till databasen Databas Alla klienter är inloggade mot samma schema i olika unika sessioner. 23
Ansluta till en databasserver UNIK session Klient user- 5 process serverprocess 4 Server user/passwd@host 2 3 listenerprocess 1 1. Listener-process lyssnar efter anrop över nätverket 2. Klienten startar ett program och loggar in. Detta skapar en user-process hos klienten 3. Anropet noteras av listener-process 4. En server-process startar på databasservern. Denna server-process kommunicerar sedan med Oracle Instance (DBMS). 5. User-process kommunicerar med server-process under resten av den unika sessionens längd 24
"Köra en fråga" 1 select fnamn,enamn from kund order by fnamn asc; user- server- process 3 resultat process 2 "Köra en fråga" går i tre steg: 1. PARSE: user-process skickar SQL-satsen till server-process och begär kompilering. Oracle Instance utför kompilering, i och returnerar status: t success eller failure 2. EXECUTE: Oracle Instance hämtar data från datafiler eller data base buffer cache 3. FETCH: server-process returnerar resultatet från tabellen kund, sorterat på fnamn till userprocess 25
Olika sessioner user = H18ABCDE sid,serial# = 9,244 sid,serial# = 13,12847 userprocess userprocess serverprocess serverprocess Ibland kan en session "låsa sig" och måste då "dödas": alter system kill session 'session-id,session-serial' select sid serial# from v$session where username = 'H18ABCDE'; Ovanstående kommando "dödar"" specifik select sid,serial# session. Vi hittar session-id och session-serial parametrarna i v$session view (kolumnerna sid and serial#). Dvs D.v.s. i data dictionary. alter system kill session '9,2444' 26 SID SERIAL# ------ ---------- 9 2444 13 12847
ACID-Properties En databastransaktion eller transaktion, ki i fortsättningen refererad till som T. En T ska uppfylla egenskaperna som kallas ACID properties: p Atomicity En T är en logisk enhet av arbete som måste utföras i sin helhet, eller inte alls Consistency En lyckad T tar databasen från ett konsistent tillstånd till nästa, d.v.s. en T förändrar datainnehållet i databasen Isolation Effekterna av Tx är inte synliga för andra Tn, förrän Tx har gjort commit Durability När en T har gjort commit är effekterna av den permanenta i databasen 27
Commit och rollback Commit och rollback En T involverar en eller fler SQL DMLsatser, som insert, update eller delete En T avslutas med commit för att göra effekterna av T permanenta (spara) En T avslutas med rollback för att göra effekterna av T ogjorda (ångra) 28
Logisk enhet (atomicity) it update personal set lön = lön - 3000 where anstnr = 120; update kontor set ktyp = 'källare' where anstnr = 120; update parkering set ptyp = 'ej_tak' where anstnr = 120; tid = x commit; eller rollback; T = logisk enhet av arbete. Sänk lön, byt kontor och byt parkering. Kräver tre deltransaktioner. Under tiden x, som går efter det att T är klar och inte commit eller rollback utförts, så finns värdena innan effekterna av T lagrade i rollback segment eller som det heter fr.o.m. Oracle 9i: undo segment. 29
Lås KUND user = h18abcde session x update kund set fnamn = 'bosse' where knr = 1;.. tid = x. commit; eller rollback; user = h18abcde session y sse undo segment (old image) DML: update och delete genererar undo dt! data! 30 DML-lås (new image) Låst data är bara synligt i session x! Låsen släpper vid commit eller rollback, och effekerna blir synliga i alla sessioner. Kör följande SQL under tiden x: select fnamn from kund where knr = 1; Vad ser session y?
Integritetsproblem t The lost update problem En transaktion T1 skriver över en annan transaktion T2:s förändringar T1 tid T2 saldo fetch(saldo) 100 1 100 update(saldo) 1000 2 3 4 5 6 fetch(saldo) 100 update(saldo) 400 100 100 1000 400 400 Saldot skulle ha varit 100 + 900 + 300 = 1300, T2 skriver över T1. Lösning = lås! T2 skulle inte fått läsa saldo förrän vid tid = 4. 31
Olika låstyper Integritetsproblem av typen the lost update problem, kan undvikas genom en teknik som kallas låsning. Vi antar att databasen stödjer två olika typer av lås: 1. X-lock (exlusive locks = skrivlås) 2. S-lock (shared locks = läslås) T2 vill ha X S AndraT har X N N S N Y N = no = nej Y = yes = ja 32 Y Y
The End 33