Prosedyrer Lars Vidar Magnusson October 26, 2011 Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 26, 2011 1 / 19
Repetisjon om triggere og prosedyrer Triggere og prosedyrer ligner på hverandre i forhold til API og syntax, men de skiller seg i hvordan de brukes. Triggere er programkode som blir kjørt ved visse hendelser i en database. Automatisere en velkomstmail når en ny bruker blir lagt til Automatisk legge til rader i en avhengig tabell. Prosedyrer er programkode som vi selv kan eksekvere etter behov. Sjekke database for uønskede kunder Lage forenklede grensesnitt for innsetting i tabeller Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 26, 2011 2 / 19
Fordeler og ulemper med prosedyrer Prosedyrer kan brukes til å legge funksjonalitet i databasen. Dette har en rekke fordeler, men også en del ulemper. Fordeler Kan øke hastigheten siden SQL-spørringene kan kompileres slik at de kjører raskere. Kan spare nettverkstrafikk Kan gjenbrukes fra alle platformer Kan sikres med det integrerte sikkerhetsystemet Ulemper Kan senke den generelle ytelsen til databasen. Kan være vanskelige å uvikle Kan være vanskelige å teste for feil. Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 26, 2011 3 / 19
Prosedyrer i MySQL MySQL har et nokså primitivt grensesnitt for å utvikle lagrede prosedyrer, men man kan oppnå mye med litt kreativ bruk. I MySQL deklareres prosedyrer med følgende sytaks. CREATE [ DEFINER = { u s e r CURRENT USER } ] PROCEDURE sp name ( [ [ IN OUT INOUT ] param name t y p e [,... ] ] ) [ c h a r a c t e r i s t i c... ] r o u t i n e b o d y Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 26, 2011 4 / 19
Eksempel på en prosedyre i MySQL Et eksempel på en prosedyre som henter ut alle verdier og rader fra en tabell. DELIMITER // CREATE PROCEDURE G e t A l l V a l u e s ( ) BEGIN SELECT FROM t a b e l l ; END // DELIMITER ; Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 26, 2011 5 / 19
Eksempel på en prosedyre i MySQL Et eksempel på en prosedyre som henter ut alle verdier og rader fra en tabell. DELIMITER // CREATE PROCEDURE G e t A l l V a l u e s ( ) BEGIN SELECT FROM t a b e l l ; END // DELIMITER ; Denne prosedyre kan kalles med følgende kommando CALL G e t A l l V a l u e s ( ) ; Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 26, 2011 5 / 19
Eksempel på en prosedyre med input parameter i MySQL Prosedyrer kan også ta parametere. Prosedyren under tar et input parameter som brukes i et søk etter personer med et gitt etternavn DELIMITER // CREATE PROCEDURE G e t P e r s o n s ( IN lname VARCHAR( 1 2 8 ) ) BEGIN SELECT FROM p e r s o n s WHERE l a s t n a m e=lname ; END // DELIMITER ; Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 26, 2011 6 / 19
Eksempel på en prosedyre med input parameter i MySQL Prosedyrer kan også ta parametere. Prosedyren under tar et input parameter som brukes i et søk etter personer med et gitt etternavn DELIMITER // CREATE PROCEDURE G e t P e r s o n s ( IN lname VARCHAR( 1 2 8 ) ) BEGIN SELECT FROM p e r s o n s WHERE l a s t n a m e=lname ; END // DELIMITER ; En slik prosedyre kan kalles med følgende kommando CALL G e t P e r s o n s ( Magnusson ) ; Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 26, 2011 6 / 19
Eksempel på en prosedyre med output parameter i MySQL Denne prosedyren returnerer antallet personer med et gitt etternavn i et output parameter DELIMITER // CREATE PROCEDURE GetNumPersons ( IN lname VARCHAR( 1 2 8 ), OUT num persons INT ) BEGIN SELECT COUNT( i d ) INTO num persons FROM p e r s o n s WHERE l a s t n a m e=lname ; END // DELIMITER ; Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 26, 2011 7 / 19
Eksempel på en prosedyre med output parameter i MySQL Denne prosedyren returnerer antallet personer med et gitt etternavn i et output parameter DELIMITER // CREATE PROCEDURE GetNumPersons ( IN lname VARCHAR( 1 2 8 ), OUT num persons INT ) BEGIN SELECT COUNT( i d ) INTO num persons FROM p e r s o n s WHERE l a s t n a m e=lname ; END // DELIMITER ; Et ekstra steg må til for å få hentet ut verdien CALL G e t P e r s o n s ( Magnusson, @num persons ) ; SELECT @num persons AS n u m b e r o f p e r s o n s ; Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 26, 2011 7 / 19
Et siste eksempel på en prosedyre i MySQL Prosedyrer kan også inneholde variable. Her er en prosedyre som returnerer en streng med alle tallene fra 1 til et gitt tall. DELIMITER // DROP PROCEDURE IF EXISTS GetNumString // CREATE PROCEDURE GetNumString ( IN max INT ) BEGIN DECLARE x INT ; DECLARE s t r VARCHAR( 1 0 2 4 ) ; SET x = 1 ; SET s t r = ; WHILE x <= max DO SET s t r = CONCAT( s t r, x,, ) ; SET x = x + 1 ; END WHILE ; SELECT s t r ; END // DELIMITER ; Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 26, 2011 8 / 19
Flere eksempler Mange flere eksempler og mere informasjon kan finnes på http://www.mysqltutorial.org/ Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 26, 2011 9 / 19
Prosedyrer i SQL Server Prosedyrer i SQL Server deklareres med følgende syntaks CREATE { PROC PROCEDURE } [ schema name. ] procedure name [ ; number ] [ { @parameter [ type schema name. ] d a t a t y p e } [ VARYING ] [ = d e f a u l t ] [ OUT OUTPUT ] [READONLY] ] [,... n ] [ WITH <p r o c e d u r e o p t i o n > [,... n ] ] [ FOR REPLICATION ] AS { [ BEGIN ] s q l s t a t e m e n t [ ; ] [... n ] [ END ] } [ ; ] <p r o c e d u r e o p t i o n > ::= [ ENCRYPTION ] [ RECOMPILE ] [ EXECUTE AS C l a u s e ] Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 26, 2011 10 / 19
Eksempel på prosedyre i SQL Server IF OBJECT ID ( DAS. G e t A l l V a l u e s, P ) I S NOT NULL DROP PROCEDURE DAS. G e t A l l V a l u e s ; GO CREATE PROCEDURE DAS. G e t A l l V a l u e s AS SET NOCOUNT ON; SELECT FROM DAS. t a b e l l ; GO Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 26, 2011 11 / 19
Eksempel på prosedyre i SQL Server IF OBJECT ID ( DAS. G e t A l l V a l u e s, P ) I S NOT NULL DROP PROCEDURE DAS. G e t A l l V a l u e s ; GO CREATE PROCEDURE DAS. G e t A l l V a l u e s AS SET NOCOUNT ON; SELECT FROM DAS. t a b e l l ; GO Denne prosedyren kan eksekveres på en av to måter EXECUTE DAS. G e t A l l V a l u e s ; GO EXEC DAS. G e t A l l V a l u e s ; GO Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 26, 2011 11 / 19
Eksempel på en prosedyre med parameter i SQL Server Denne prosedyren henter ut alle personene med samme etternavn. CREATE PROCEDURE DAS. G e t P e r s o n s @LastName n v a r c h a r ( 1 2 8 ) AS SET NOCOUNT ON; SELECT FROM DAS. p e r s o n s WHERE l a s t n a m e = @LastName ; GO Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 26, 2011 12 / 19
Eksempel på en prosedyre med parameter i SQL Server Denne prosedyren henter ut alle personene med samme etternavn. CREATE PROCEDURE DAS. G e t P e r s o n s @LastName n v a r c h a r ( 1 2 8 ) AS SET NOCOUNT ON; SELECT FROM DAS. p e r s o n s WHERE l a s t n a m e = @LastName ; GO Det er flere måter å eksekvere en prosedyre med parametere EXECUTE DAS. G e t P e r s o n s N Magnusson ; GO EXECUTE DAS. G e t P e r s o n s @LastName = N Magnusson ; GO Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 26, 2011 12 / 19
Eksempel på prosedyre med outputparameter i SQL Server Denne prosedyren teller alle personene med samme etternavn. CREATE PROCEDURE DAS. G e t P e r s o n s @LastName n v a r c h a r ( 1 2 8 ), @NumPersons i n t OUT AS SET NOCOUNT ON; SET @NumPersons = SELECT COUNT( i d ) FROM DAS. p e r s o n s WHERE l a s t n a m e = @LastName ; GO Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 26, 2011 13 / 19
Eksempel på prosedyre med outputparameter i SQL Server Denne prosedyren teller alle personene med samme etternavn. CREATE PROCEDURE DAS. G e t P e r s o n s @LastName n v a r c h a r ( 1 2 8 ), @NumPersons i n t OUT AS SET NOCOUNT ON; SET @NumPersons = SELECT COUNT( i d ) FROM DAS. p e r s o n s WHERE l a s t n a m e = @LastName ; GO Output parameterne må lagres i variable DECLARE @NumPersons ; EXECUTE DAS. G e t P e r s o n s N Magnusson, @NumPersons OUT; EXECUTE DAS. G e t P e r s o n s @LastName = N Magnusson, @NumPersons OUT; GO Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 26, 2011 13 / 19
Dokumentasjon av Transact-SQL MSDN biblioteket inneholder god dokumentasjon av stort sett alle aspekter av SQL Server. For dokumentasjon av Transact-SQL gå til http://msdn.microsoft.com/enus/library/bb510741(v=sql.100).aspx. Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 26, 2011 14 / 19
Triggere og prosedyrer i CLR SQL Server støtter CLR integrasjon av triggere og prosedyrer. Dette gjør at man kan skrive triggere med hvilket som helst språk med CLR-støtte. C#, F#, VB, IronPython... Dette gjør det mulig å utvikle triggere og prosedyrer i et skikkelig programmeringspråk. Arrays, klasser, foreach-løkker, bitwise operatorer... Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 26, 2011 15 / 19
Triggere og prosedyrer i CLR SQL Server støtter CLR integrasjon av triggere og prosedyrer. Dette gjør at man kan skrive triggere med hvilket som helst språk med CLR-støtte. C#, F#, VB, IronPython... Dette gjør det mulig å utvikle triggere og prosedyrer i et skikkelig programmeringspråk. Arrays, klasser, foreach-løkker, bitwise operatorer... CLR integrasjonen er typisk ikke påslått per default (Se enabling CLR integration) Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 26, 2011 15 / 19
Eksempel på en trigger i C# Et eksempel på en trigger i C# namespace CLRNamespace { p u b l i c c l a s s CLRTriggers { [ S q l T r i g g e r (Name=@ T e s t T r i g g e r, Target= [ schema ] [ t a b l e ], Event= FOR INSERT, UPDATE, DELETE ) ] p u b l i c s t a t i c v o i d E m a i l A u d i t ( ) { S q l T r i g g e r C o n t e x t t r i g g e r C o n t e x t = S q l C o n t e x t. T r i g g e r C o n t e x t ; i f ( t r i g g e r C o n t e x t. T r i g g e r A c t i o n == T r i g g e r A c t i o n. I n s e r t ) SOME OPERATION ; e l s e i f ( t r i g g e r C o n t e x t. T r i g g e r A c t i o n == T r i g g e r A c t i o n. Update ) SOME OPERATION ; e l s e i f ( t r i g g e r C o n t e x t. T r i g g e r A c t i o n == T r i g g e r A c t i o n. D e l e t e ) SOME OPERATION ; } } } Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 26, 2011 16 / 19
Koble opp en CLR trigger For å bruke triggeren må den først kobles opp CREATE TRIGGER T e s t T r i g g e r ON U s e r s FOR INSERT, UPDATE, DELETE AS EXTERNAL NAME CLRNamespace. CLRTriggers. T e s t T r i g g e r Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 26, 2011 17 / 19
Et eksempel på en prosedyre i CLR Et enkelt eksempel på en prosedyre skrevet i C# namespace CLRNamespace { p u b l i c c l a s s CLRProcedures { [ M i c r o s o f t. S q l S e r v e r. S e r v e r. S q l P r o c e d u r e ] p u b l i c s t a t i c v o i d GetNumPersons ( out S q l I n t 3 2 v a l u e ) { u s i n g ( S q l C o n n e c t i o n c o n n e c t i o n = new S q l C o n n e c t i o n ( c o n t e x t c o n { v a l u e = 0 ; c o n n e c t i o n. Open ( ) ; SqlCommand command = new SqlCommand ( SELECT COUNT( i d ) FROM p SqlDataReader r e a d e r = command. E x e c u t e R e a d e r ( ) ; u s i n g ( r e a d e r ) { i f ( r e a d e r. Read ( ) ) v a l u e = r e a d e r. G e t S q l I n t 3 2 ( 0 ) ; } } } } Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 26, 2011 18 / 19
Registrering av CLR prosedyre CLR prosedyrer må også registreres før de kan brukes CREATE PROCEDURE PriceSum (@sum i n t OUTPUT) AS EXTERNAL NAME CLRNamespace. CLRProcedures. GetNumPersons Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 26, 2011 19 / 19