Tilkobling og Triggere Lars Vidar Magnusson October 12, 2011 Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 12, 2011 1 / 25
Tilkobling med PHP PHP bruker databasespesifike moduler til å koble til en database. Under er et enkelt eksempel på hvordan PHP kan brukes til å koble til en MySQL database. // Koble t i l databasen $ t i l k o b l i n g = mysql connect ( HOST, BRUKERNAVN, PASSORD // Velg h v i l k e n d a t a b a s e v i s k a l bruke mysql select db ( DATABASENAVN, $ t i l k o b l i n g ) ; Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 12, 2011 2 / 25
Kjøre spørring med PHP Etter å ha koblet til kan man bruke tilkoblingen til å utføre spørringer. // Kjor en s p o r r i n g pa den t i l k o b l e d e databasen $ s q l = SQLSELECTSETNING ; $ r e s u l t a t = mysql query ( $ s q l, $ t i l k o b l i n g ) ; // S k r i v i n n h o l d e t i en av kolonnene f o r h v e r rad while ( $rad = mysql fetch assoc ( $ r e s u l t a t ) ) { echo $rad [ KOLONNENAVN ]. <br /> ; } Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 12, 2011 3 / 25
Opprydning med PHP Etter å ha koblet til og utført en spørring må man jo selvsagt også rydde opp etter seg. // F j e r n e r e s u l t a t e t f r a minnet m y s q l f r e e r e s u l ( $ r e s u l t a t ) ; // Lukke t i l k o b l i n g e n m y s q l c l o s e ( $ t i l k o b l i n g ) ; Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 12, 2011 4 / 25
Tilkobling med JDBC I Java så har vi mulighet til å koble til med både metode 3 og 4. Under er et eksempel på tilkobling med flerlagsmodellen. JDBC er tilgjengelig i java.sql.* // L a s t e k l a s s e n som i n n e h o l d e r d r i v e r e n C l a s s. forname ( com. FIRMA. DRIVER ) ; // Koble t i l databasen Connection conn = DriverManager. g e t C o n n e c t i o n ( j d b c : FIRMA : FIRMASPESINFO, BRUKERNAVN, PASSORD ) ; Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 12, 2011 5 / 25
Hente ut data med JDBC Når vi har koblet til en database kan vi bruke denne koblingen til å hente ut data. // Lag o b j e k t e t som t r e n g s f o r a u t f o r e s p o r r i n g e n Statement stmt = conn. c r e a t e S t a t e m e n t ( ) ; t r y { // U t f o r s p o r r i n g e n og s k r i v ut en kolonne f r a h v e r rad i R e s u l t S e t r e s = stmt. executequery ( SQLSELECTSETNING ) ; while ( r e s. next ( ) ) System. out. p r i n t l n ( r e s. g e t S t r i n g (KOLONNENUMMER) ) ; } catch ( SQLException s q l e ) { s q l e. p r i n t S t a c k T r a c e ( ) ; } Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 12, 2011 6 / 25
Sette inn data med JDBC Vi kan også bruke den samme database tilkoblingen til å sette inn data. // Lag o b j e k t e t som t r e n g s f o r a u t f o r e s p o r r i n g e n Statement stmt = conn. c r e a t e S t a t e m e n t ( ) ; t r y { // U t f o r i n s e t t i n g e n R e s u l t S e t r e s = stmt. executequery ( SQLINSERTSETNING ) ; } catch ( SQLException s q l e ) { s q l e. p r i n t S t a c k T r a c e ( ) ; } Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 12, 2011 7 / 25
Rettelse i forhold til.net og database tilkobling Se slide om.net tilkobling fra forrige leksjon. Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 12, 2011 8 / 25
Tilkobling med.net Som med Java så kan vi med.net koble til databaser ved hjelp av flere metoder. Under er et eksempel på hvordan en tilkobling gjøres med metode 3 mot en SQL Server server. Denne modulen er tilgjengelig i System.Data.SqlClient namespace. // Koble t i l med t i l k o b l i n g s s t r e n g s t r i n g c o n n e c t i o n S t r i n g = Data Source=HOST; + I n i t i a l C a t a l o g=databasenavn; + I n t e g r a t e d S e c u r i t y=t r u e ; 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 n e c t i o n S t r i n // Apne d a t a b a s e k o b l i n g e n c o n n e c t i o n. Open ( ) ; Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 12, 2011 9 / 25
Lese data med.net Når vi har fått opprettet koblingen kan vi utføre operasjoner e.g. hente ut data. // Lag o b j e k t e t som s k a l b r u k e s f o r a k j o r e s p o r r i n g e n SqlCommand command = new SqlCommand ( SQLSELECTSETNING, c o n // Kjor s p o r r i n g e n og k j o r en l o k k e gjennom r e s u l t a t e t SqlDataReader r e a d e r = command. ExecuteReader ( ) ; while ( r e a d e r. Read ( ) ) Console. W r i t e L i n e ( {0}, r e a d e r [ 0 ] ) ; // Rydd opp e t t e r s p o r r i n g r e a d e r. C l o s e ( ) ; Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 12, 2011 10 / 25
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 12, 2011 11 / 25
Eksempler på triggere Triggere er anvendelige til mye forskjellig Sjekke inndata for å garantere gyldige verdier Sjekke oppdaterte verdier for gyldige verdier Utføre flere hendelse ved sletting Kan brukes til å automatisere applikasjonsregler e.g. ivareta en sum Kan brukes til å automatisere alarmer Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 12, 2011 12 / 25
Fordeler og ulemper med triggere Fordeler: Siden applikasjonsregler kan settes opp med triggere vil man alltid være sikker på at alle tilkoblede applikasjoner følger sammer regler. Man slipper å sende data over nettverket Databaser er gode på databehandling Ulemper: Ulike DBMSer bruker ulikt språk med ulike muligheter for definisjon av triggere Programreglene i databasen gjør det vanskelig å bytte database Kan gjøre det vanskeligere å debugge applikasjoner Kan føre til dobbelt opp med kode for feilsjekking De kan ofte bli vanskelige å skrive, da språkene typisk ikke er hverken veldokumenterte eller elegante. Alle applikasjoner må følge regler satt av triggere Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 12, 2011 13 / 25
Tips til triggere Siden triggere har såpass mange ulemper, må man være forsiktig med når man tar de i bruk. Bruk triggere kun på universelle regler La grenseverdier, feilmeldinger osv. bli hentet fra en lett tilgjengelig tabell Sørg for at alle inkluderte triggere er veldokumenterte Vær påpasselig med rekursive triggere. Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 12, 2011 14 / 25
Jobbe med triggere Det er ulik syntax i de ulike DBMSene, men visse ting har de til felles. CREATE TRIGGER triggernavn DROP TRIGGER triggernavn De kan operere på ulike events DELETE INSERT UPDATE Timingen kan styres BEFORE AFTER INSTEAD OF Det varierer om man kan ha flere triggere på samme hendelse og timing Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 12, 2011 15 / 25
Triggere i MySQL MySQL har en implementasjon for triggere, men den er veldig begrenset. CREATE [ DEFINER={u s e r CURRENT USER} ] TRIGGER t r i g g e r n a m e TRIGGER TIME TRIGGER EVENT ON table name FOR EACH ROW t r i g g e r s t m t Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 12, 2011 16 / 25
Eksempler på triggere i MySQL Under er noen enkle eksempler på triggere i MySQL CREATE TABLE t r i g g e r t e s t ( navn VARCHAR(15) PRIMARY KEY, v e r d i INT ) ; CREATE TRIGGER t t h t r i g g e r i n s e r t BEFORE INSERT ON t r i g g e r t e s t FOR EACH ROW INSERT INTO t r i g g e r t e s t h i s t o r i e VALUES(NOW( ),NEW. navn,new. v e r d i ) ; CREATE TRIGGER t t h t r i g g e r u p d a t e BEFORE UPDATE ON t r i g g e r t e s t FOR EACH ROW INSERT INTO t r i g g e r t e s t h i s t o r i e VALUES(NOW( ),NEW. navn,new. v e r d i ) ; Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 12, 2011 17 / 25
Eksempler på triggere i MySQL Her er det et enda et eksempel på triggere i MySQL CREATE TABLE t r i g g e r t e s t ( i d i n t PRIMARY KEY, a l d e r INT ) ; CREATE TRIGGER i n s e r t s j e k k BEFORE INSERT ON t r i g g e r t e s t FOR EACH ROW BEGIN IF NEW. a l d e r < 0 THEN SET NEW. a l d e r = 0 ; ELSEIF NEW. a l d e r > 100 THEN SET NEW. a l d e r = 1 00; END IF ; END Her trengs det også en trigger for UPDATE for å unngå inkonsistens. Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 12, 2011 18 / 25
Triggere i SQL Server Triggerimplementasjonen i SQL Server er mere kompleks enn hos MySQL. Her støttes et ganske så komplett programmeringsspråk. CREATE TRIGGER t r i g g e r n a m e ON { table view } [ WITH ENCRYPTION ] { { FOR AFTER INSTEAD OF } { [INSERT] [, ] [UPDATE] [, ] [DELETE] } [ WITH APPEND] [NOT FOR REPLICATION ] AS [ { I F UPDATE ( column ) [ { AND OR } UPDATE ( column ) ] [... n ] IF ( COLUMNS UPDATED ( ) { b i t w i s e o p e r a t o r } u p d a t e d { c o m p a r i s o n o p e r a t o r } column bitmask [... n ] } ] s q l s t a t e m e n t [... n ] } Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 12, 2011 19 / 25
Eksempler på triggere i SQL Server Her er et enkelt eksempel på en trigger i SQL Server som skriver ut fullt navn på nye personer som gblir lagt til. CREATE TABLE p e r s o n ( i d INT, f o r n a v n VARCHAR( 5 0 ), e t t e r n a v n VARCHAR( 5 0 ) ) ; CREATE TRIGGER t r i g a d d P e r s o n ON p e r s o n FOR INSERT AS DECLARE @ f u l l t N a v n VARCHAR( 1 0 0 ) ; SELECT @ f u l l t N a v n = (SELECT f o r n a v n + + e t t e r n a v n FROM INSERTED ) ; PRINT Ny p e r s o n med navn + @ f u l l t N a v n + l a g t t i l. Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 12, 2011 20 / 25
Eksempler på triggere i SQL Server Og her er et annet eksempel på trigger i SQL Server som tar for seg oppdatering av en person. CREATE TRIGGER t r i g u p d a t e P e r s o n ON p e r s o n FOR UPDATE AS DECLARE @oldname VARCHAR( 1 0 0 ) ; DECLARE @newname VARCHAR( 1 0 0 ) ; IF NOT UPDATE( f o r n a v n ) AND NOT UPDATE( e t t e r n a v n ) BEGIN RETURN END SELECT @oldname = (SELECT f o r n a v n + + e t t e r n a v n FROM D e l e t e d ) ; SELECT @newname = (SELECT f o r n a v n + + e t t e r n a v n FROM I n s e r t e d ) ; PRINT Navnet b l e f o r a n d r e t f r a + @oldname + t i l + @newname + ; Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 12, 2011 21 / 25
Eksempler på triggere i SQL Server Det tredje eksempelet sørger for at det skrives ut en melding når personen med id = 1 blir slettet. CREATE TRIGGER t r i g d e l P e r s o n ON p e r s o n FOR DELETE AS DECLARE @id AS I n t ; SELECT @id = (SELECT i d FROM D e l e t e d ) ; IF ( @id = 1) BEGIN PRINT Du s l e t t e t naa p e r s o n 1!!! END; Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 12, 2011 22 / 25
Eksempler på triggere i SQL Server Her er et eksempel som bruker INSTEAD OF til å hindre at rader kan slettes fra en tabell. CREATE TRIGGER t r i g d e l P e r s o n 2 ON p e r s o n INSTEAD OF DELETE AS PRINT Fra denne t a b e l l e n kan data a l d r i s l e t t e s : ) ; Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 12, 2011 23 / 25
CREATE TRIGGER t r i g c o u n t P e r s o n ON p e r s o n FOR INSERT,UPDATE,DELETE AS DECLARE @newname VARCHAR( 1 0 0 ) ; SELECT @newname = (SELECT e t t e r n a v n FROM I n s e r t e d ) ; IF NOT EXISTS (SELECT FROM N a v n T e l l i n g WHERE e t t e r n a v n = @newname ) BEGIN INSERT INTO N a v n T e l l i n g VALUES(@newName, 1 ) ; END UPDATE N a v n T e l l i n g SET a n t a l l = (SELECT COUNT( ) FROM Person WHERE e t t e r n a v n = @newname ) WHERE e t t e r n a v n = @newname ; Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 12, 2011 24 / 25 Eksempler på triggere i SQL Server Her er et eksempel som bruker en annen tabell til å ivareta hvor mange forekomster det finnes av hvert etternavn i person. CREATE TABLE N a v n T e l l i n g ( e t t e r n a v n VARCHAR( 4 5 ), a n t a l l i n t
Eksempler på triggere i SQL Server Her er et siste eksempel som sender mail når nye personer legges til CREATE TRIGGER t r i g s e n d M a i l N y P e r s o n ON Person FOR INSERT AS DECLARE @navn AS VARCHAR( 1 0 0 ) ; DECLARE @melding AS VARCHAR( 1 5 0 ) ; SELECT @navn = (SELECT f o r n a v n + + e t t e r n a v n FROM i n s SELECT @melding = Ny kunde l a g t t i l : + @navn ; EXEC master.. x p s e n d m a i l @ r e c i p i e n t s= tom. h. n a t t @ h i o f. no, @message = @ melding, @ s u b j e c t = Ny kunde l a g t t i l ; Lars Vidar Magnusson () Forelesning i DAS 11.10.2011 October 12, 2011 25 / 25