Databasföreläsning Del 2 lagrade procedurer, vyer och transaktioner
Lagrade procedurer (Stored procedures) En stored procedure är en procedur (funktion) lagrad i en databas, och exekveras direkt på databasservern Den har ett namn, en uppsättning parametrar och satser Består av en eller flera SQL-satser som kompilerats till en och samma procedur
Fördelar med lagrade procedurer: Lagrade procedurer förbättrar prestandan i applikationen Minskar trafiken mellan applikationen och databasservern -> mindre kommunikationstid Get_Salary() Get_Salary() Databas Lagrad prodecur Get_Salary() Get_Salary(...)
Fördelar med lagrade procedurer: Skapar kod som är modulär och går att återanvända i valfri del av applikationen Säkerhet det går att begränsa applikationen till att endast använda lagrade procedurer Ökad funktionalitet i form av argument, variabler, loopar, vilkor, retur-värden med mera Förkompilerade frågor databas-servern bestämmer i förväg vilket sätt att köra frågan som är snabbast
Första delen av SQL-kommandot som skapar en procedur är: CREATE PROCEDURE (kan förkortas: CREATE PROC) Nästkommande kommando är namnet på proceduren: CREATE PROCEDURE procgetnames Därefter kommer själva proceduren, vanligtvis mellan AS och GO: CREATE PROCEDURE procgetname AS SELECT names FROM users GO;
För att sedan köra proceduren kan vi antigen använda grafiska gränssnittet i Visual Studio, eller via SQL-kommando: Finns tre sätt att med SQL anropa en lagrad procedur: 1. namnpåprocedur 2. EXEC namnpåprocedur 3. EXECUTE namnpåprocedur
Lagrade procedurer kan ta argument vid anrop, samt använda variabler. Ex: CREATE PROC spgetpersonsbyplats @Plats int AS BEGIN END Argument SELECT Pe_Fornamn, Pe_Efternamn FROM Tbl_Person WHERE Pe_Bor = @Plats För att anropa: spgetpersonsbyplats 1
Lagrade procedurer går att skapa antingen manuellt med SQLkommandon, eller via grafiskt gränssnitt i Visual Studio
För att ändra en lagrad procedur används: ALTER PROCEDURE uppdateradprocedur För att radera en lagrad procedur används: DROP PROCEDURE namnpåprocedur
Vyer (Views) Vyer kan betraktas som en virtuell tabell med vilken man kan se delar av en eller flera tabell/er på det sätt man önskar samlade på ett ställe. En vy lagras som en SQL-fråga vilken exekveras så fort vyn används. En vy kan behandlas som en vanlig tabell med vissa restriktioner som insättning av ny data, borttagning eller modifiering. En vy skapas med kommandot create view Innehållet i vyn kan listas ut med vanliga select-satser som används för andra tabeller. Vyn kan tas bort med kommandot drop view vynamn.
Fördelar med vyer En vy förenklar komplexa frågor. Tex då en sekvens av frågor krävs för att erhålla ett resultat. Användaren behöver inte veta hur många tabeller man utnyttjar eller hur dessa tabeller som man använder för att skapa den samlade tabellen ser ut, utan allting ses som en enda tabell. Vidare kan kolumn-namn förenklas. Ger ytterligare säkerhet, eftersom olika användare har olika åtkomst till databasen och vyer kan användas för att kontrollera den informationen användaren har access till.
Vyer En vy är resultatet av en lagrad SQL-fråga Ett exempel på en SQL-fråga: SELECT Tbl_Person.Pe_Fornamn, Tbl_Person.Pe_Efternamn, Tbl_Plats.Pl_Lan FROM Tbl_Person JOIN Tbl_Plats ON Tbl_Person.Pe_Bor=Tbl_Plats.Pl_Id ORDER BY Tbl_Person.Pe_Efternamn; Pe_Fornamn Pe_Efternamn Pl_Lan 1 Siv Kvist Västerbotten 2 Tina Olofsson Västerbotten 3 Olle Svensson Halland
Vyer Som en vy: CREATE VIEW vpersoner AS SELECT Tbl_Person.Pe_Fornamn AS Fornamn, Tbl_Person.Pe_Efternamn AS Efternamn, Tbl_Plats.Pl_Lan AS Lan FROM Tbl_Person JOIN Tbl_Plats ON Tbl_Person.Pe_Bor=Tbl_Plats.Pl_Id; Fornamne Efternamn Lan 1 Olle Svensson Halland 2 Tina Olofsson Västerbotten 3 Siv Kvist Västerbotten
Vyer För att sedan visa vyn med en SQL-fråga: SELECT * FROM vpersoner; Fornamne Efternamn Lan 1 Olle Svensson Halland 2 Tina Olofsson Västerbotten 3 Siv Kvist Västerbotten
Vyer - viktigt CREATE VIEW vpersoner AS SELECT * FROM Tbl_Person ORDER BY Pe_Eftenamn; ORDER BY fungerar ej i vyer då rad-ordningen i en tabell eller vy inte är definerad.
Vyer Dock fungerar det att i efterhand använda ORDER BY på själva vyn: SELECT * FROM vpersoner ORDER BY Lan; Fornamne Efternamn Lan 1 Olle Svensson Halland 2 Tina Olofsson Västerbotten 3 Siv Kvist Västerbotten
Exempel 1 CREATE VIEW vdept AS (SELECT empno, ename, job, mgr FROM emp WHERE deptno = 30) SELECT * FROM vdept; EMPNO ENAME JOB MGR 7698 BLAKE MANAGER 7839 7654 MARTIN MANAGER 7698 7499 ALLEN SALESMAN 7698 7844 TURNER SALESMAN 7698 7900 JAMES CLERK 7698
Exempel 2 Vyer används ofta för att skapa en samlad information om verksamhet eller den information som databasen innehåller. CREATE VIEW dept_size (avdelning, antal_anställda) AS( SELECT dname, count(empno) FROM dept, emp WHERE dept.deptno = emp.deptno(+) GROUP BY dname ); SELECT * FROM dept_size; avdelning antal_anställda ACCOUNTING 3 OPERATIONS 0 RESEARCH 5
Vyer Uppdatera och radera Vyer Vyer går att uppdatera med: ALTER VIEW Vyer raderas med: DROP VIEW namnpåview
Vyer går att skapa antingen manuellt med SQL-kommandon, eller via grafiskt gränssnitt i Visual Studio
Transaktioner
Transaktioner (transactions) En serie operationer som hör ihop kallas transaktion. BEGIN TRANSACTION; sql_statement statement_block COMMIT TRANSACTION;
ACID A - atomicity (odelbarhet). C - consistency preserving ("konsistensbevarande, logiskt koherent). I isolation (isolering). D durability ( hållbarhet ).
När ska jag använda transactions? I en batch, där flera rader måste läggas in, uppdateras eller raderas som en enda enhet. När en ändring till i en tabell kräver att andra tabeller hålls konsekventa. När du ändrar data i två eller flera databaser samtidigt. I distribuerade transaktioner, där data manipuleras i databaser på olika servrar.
Transaktionen sker i 3 steg 1.Påbörja transaktionen. 2.Processa kommandona. 3.Kontrollera om något fel skett. Om fel har skett rollbacka transaktionen Annars commita transaktionen
Commit och Rollback Commit Rollback En krasch
Transaktions-kontroll COMMIT För att spara ändringar. ROLLBACK För att rulla tillbaka eller ångra ändringar SAVEPOINT Skapar en återställningspunkt i en transaction som en rollback återställs till. SET TRANSACTION Namnger transaktionen.
Recovery Avbrutna transaktioner Ska tas bort. Transaktioner som räknas som klara Måste kontrollereras
Loggfilen Där står Vilken transaktion det är. Vilket dataobjekt det handlar om. Vad det gamla värdet på dataobjektet var och Vad det nya värdet ska bli.
Backup Regelbundet göra backup När en disk går sönder sätter man in en ny disk, kopierar backupen till disken och går igenom logg-filen för att göra de ändringar som finns noterade där, vid den tidpunkt reservkopian gjordes. Se till att inte logg-filen ligger på samma disk som själva databasen.
Isolering Transaktionerna ska hållas isolerade från varandra. Detta görs vanligen med olika typer av lås.
Risker Förlorade uppdateringar Läsning av smutsiga data (dirty reads) Inkonsistenta resultat. Spökposter
Förlorad uppdatering Transaktion 1 Transaktion 2 Läs(L) L = L + 50 Skriv(L) Läs(L) L = L + 10000 Skriv(L) Transaktion 1 Transaktion 2 Läs(L) L = L + 50 Läs(L) L = L + 10000 Skriv(L) Skriv(L)
Dirty read Transaktion 1 Transaktion 2 Läs(X) X = X + 1 Skriv(X) Läs(X) Y = X * 3 Skriv(Y) Rollback
Oupprepbara läsningar (non-repeadly reads) Transaktion 1 Transaktion 2 Läs(X) Läs(X) X = X +1 Skriv(X) Commit Läs(X)
Felaktiga summor Transaktion 1 Transaktion 2 Summan = 0 Läs(X) Summan = Summan + X Läs(X) X = X - 50 Skriv(X) Läs(Y) Y = Y + 50 Skriv(Y) Commit Läs(Y) Summan = Summan + Y
Spökposter Transaktion 1 Transaktion 2 select * from T where A = 17; insert into T(A) values 17; select * from T where A = 17;
Isoleringsnivåer 1.READ UNCOMMITTED 2.READ COMMITTED 3.REPEATABLE READ 4.SERIALIZABLE (Default) 5.SNAPSHOT
Isoleringsnivåer forts