SQL Les 12 19 July 2017 1 Agenda Herhaling Stored Procedures Oefeningen User Defined Functions Triggers Oefeningen 19 July 2017 2 Herhaling DML SELECT - statement SINGLE ROW FUNCTIONS JOIN OUTER JOIN INNER JOIN SELF JOIN GROUP FUNCTIONS SUBQUERIES 19 July 2017 3 Herhaling DDL CREATE ALTER DROP TABLE 19 July 2017 4 Herhaling DML INSERT UPDATE DELETE TRANSACTIONS BEGIN TRAN COMMIT ROLLBACK 19 July 2017 5 Herhaling DDL VIEW PROCEDURELE EXTENSIONS STORED PROCEDURES USER DEFINED FUNCTIONS TRIGGERS 19 July 2017 6 View Er zijn 2 soorten “tabellen”: Fysieke tabellen VIEWS = Logische tabellen gebaseerd op een andere tabel of een andere view. (Derived tables) Bevat geen data! = venster In de databank opgeslaan als een SELECTstatement Restricted DMLs possible Procedural extensions Batch Sequence van SQL Statements Verzonden naar de database om samen uitgevoerd te worden Om DDL statements van elkaar te scheiden, dient gebruik gemaakt te worden van GO Gebruik BEGIN en END om een block van statements aan te geven 19 July 2017 8 Procedural extensions IF Statement WHILE Statement BREAK: stopt de complete while loop CONTINUE: stopt de huidige uitvoering van de while loop 19 July 2017 9 Procedural extensions CASE Statement 19 July 2017 10 Procedural extensions Locale variabelen DECLARE @variable DATATYPE Kunnen enkel gebruikt worden in de huidige batch Geheugen reserveren Waarde toekennen SET @variable = DesiredValue OF SELECT @variable = expression FROM table @@ variabelen zijn global variables 19 July 2017 11 Specific statements RETURN ~ BREAK in WHILE loop Beëindigt de batch GOTO 19 July 2017 12 Specific statements (2) RAISERROR Genereer een user-defined error message > 50000 WAITFOR DELAY TIME Een bepaalde periode wachten Tot een bepaald tijdstip wachten TIMEOUT 19 July 2017 Wachten op een message op een queue 13 Example WAITFOR declare @counter int set @counter = 1 while @counter <= 10 begin WAITFOR DELAY '00:01:00' print @counter print getdate() set @counter = @counter + 1 end 19 July 2017 14 Output Example WAITFOR 19 July 2017 15 Example RAISERROR EXEC sp_addmessage 50005, 10, N'Unvalid System user!'; if SYSTEM_USER = 'EMEA\SSCK2M' print 'APPROVED' else RAISERROR (50005, -- Message id. 10, -- Severity, 1 -- State ) 19 July 2017 16 Example GOTO (from MSDN) DECLARE @Counter int; SET @Counter = 1; WHILE @Counter < 10 BEGIN SELECT @Counter SET @Counter = @Counter + 1 IF @Counter = 4 GOTO Branch_One --Jumps to the first branch. IF @Counter = 5 GOTO Branch_Two --This will never execute. END Branch_One: SELECT 'Jumping To Branch One.' GOTO Branch_Three; --This will prevent Branch_Two from executing. Branch_Two: SELECT 'Jumping To Branch Two.' Branch_Three: SELECT 'Jumping To Branch Three.' 19 July 2017 17 ERROR Handling Opvangen van fouten in programma’s Generen van duidelijk error meldingen ‘Proper’ stoppen met de uitvoering van een programma Exception: Een probleem dat het uitvoeren van een programma blokkeert 19 July 2017 18 ERROR Handling TRY/CATCH TRY: Opvangen van de exception CATCH: Behandelen van de exception 19 July 2017 19 Example TRY/CATCH USE sample; BEGIN TRY BEGIN TRANSACTION insert into employee values(11111, 'Ann', 'Smith','d2'); insert into employee values(22222, 'Matthew', 'Jones','d4'); -- referential integrity error insert into employee values(33333, 'John', 'Barrimore', 'd2'); COMMIT TRANSACTION PRINT 'Transaction committed' END TRY BEGIN CATCH ROLLBACK PRINT 'Transaction rolled back' END CATCH 19 July 2017 20 Stored Procedure Batch van statements als object bewaard in de database 19 July 2017 21 Stored Procedure System stored procedures Eg sp_rename Komen we later op terug 19 July 2017 22 Stored Procedure Gebruik optie OUTPUT om een return waarde te gebruiken 19 July 2017 23 Stored Procedure and CLR 19 July 2017 24 Oefening Op DB MYFIRSTDB Schrijf een stored procedure delete_afd met als argument een afdelingsnummer. Breidt de procedure uit zodat de afdeling enkel wordt verwijderd uit de tabel indien de afdeling minstens 5 medewerkers bevat Test de Stored Procedure uit. Schrijf een stored procedure insert_afd die records toevoegt in de tabel afd. 19 July 2017 25 Oefening Schrijf een stored procedure die een datetime als parameter meekrijgt. De stored procedure moet wachten tot het tijdstip in de parameter en vervolgens start naar het scherm schrijven. Test de stored procedure 19 July 2017 26 Oefening Schrijf een stored procedure die de referentiële integriteit op de MYFIRSTDB checkt. 19 July 2017 27 User Defined Functions Gelijkaardig aan Stored Procedures Een output parameter is verplicht 19 July 2017 28 User Defined Functions Twee soorten Scalar-valued Eén resultaat Table-valued 19 July 2017 Een set van rijen als resultaat 29 TABLE Data Type Vaak gebruikt bij TABLE valued functions CREATE FUNCTION employees_in_project (@pr_number CHAR(4)) RETURNS TABLE AS RETURN (SELECT emp_fname, emp_lname FROM works_on, employee WHERE employee.emp_no = works_on.emp_no AND project_no = @pr_number) 19 July 2017 30 Table – Valued Functions en APPLY Vergelijkbaar met een join van tabellen CROSS APPLY: ~INNER JOIN OUTER APPLY: ~OUTER JOIN create function dbo.fn_getjob(@empid AS INT) RETURNS TABLE AS RETURN SELECT job FROM works_on WHERE emp_no = @empid AND job IS NOT NULL AND project_no = 'p1'; SELECT E.emp_no, emp_fname, emp_lname, job FROM employee as E CROSS APPLY dbo.fn_getjob(E.emp_no) AS A 19 July 2017 31 Trigger Een opzichzelf bestaande routine afhankelijk van een bepaalde tabel of view Trigger zorgt voor het uitvoeren van een actie indien er een event gebeurt op een tabel of view 3 delen: Trigger event Trigger condition Trigger action Event kan een DML of DDL statement zijn 19 July 2017 32 Trigger (2) Nadelen van triggers Triggers zijn onzichtbaar voor client application Het is niet altijd makkelijk de logica te volgen (before/after) Triggers kunnen al eens vergeten worden. Zeker als er geen documentatie over bestaat Triggers lopen steeds als een DML commando op een tabel wordt uitgevoerd. Dit kan gevolgen hebben voor de performance 19 juli 2017 33 DML Trigger Table_name | view_name: FOR | AFTER | INSTEAD OF: Object waarop de trigger gebouwd wordt Wanneer moet de actie uitgevoerd worden? INSERT | UPDATE | DELETE Na welk event moet de actie gebeuren? 19 July 2017 34 Voorbeeld trigger Veronderstel: We hebben een tabel emp We hebben een tabel emp_audit, waarin we de operaties op emp willen bijhouden Voorbeeld trigger (2) Inserted and Deleted tables Twee tabellen onderhouden door het systeem Inserted: Deleted: Bevat copies van de inserted rijen in de triggered tabel Bevat copies van de deleted rijen in de triggered tabel Een UPDATE statement wordt behandeld als een DELETE gevolgd door een INSERT 19 July 2017 37 Toepassingen van DML triggers Audit van tabellen Implementeren van business rules Referentiële integriteit forceren Meer flexibiliteit dan de referentiële integriteit op tabel level 19 July 2017 38 Sequence van triggers sp_settriggerorder System stored procedure Zetten van de order van de triggers op een tabel Eerst of laatste trigger aanduiden voor een statement type (INSERT, UPDATE, DELETE, …) sp_helptrigger Tonen van eigenschappen van een trigger Niet van toepassing voor INSTEAD OF triggers 19 July 2017 39 DDL Triggers ALL SERVER | DATABASE: Scope van de trigger (op een database of op de gehele server) EVENT_TYPE http://msdn.microsoft.com/enus/library/bb522542.aspx 19 July 2017 40 DDL Triggers EVENT_GROUP http://msdn.microsoft.com/enus/library/bb510452.aspx Verschillen met DML triggers Geen INSERTED en DELETED tabellen Geen INSTEAD OF Scope op een database of Server en niet op een tabel of view 19 July 2017 41 Example DDL Trigger USE sample; GO CREATE TRIGGER prevent_drop_triggers ON DATABASE FOR DROP_TRIGGER AS PRINT 'You must disable "prevent_drop_triggers" to drop any trigger' ROLLBACK 19 July 2017 42 Oefeningen op Triggers p. 385 Beginners Guide to SQL Server 2008 19 July 2017 43 Oefeningen Herhalingsoefeningen 19 juli 2017 44