SQL Les 11 16 February 2019
Agenda Views Oefeningen Stored Procedures User Defined Functions Herhaling Views Oefeningen Stored Procedures User Defined Functions Triggers 16 February 2019
Herhaling DML SELECT - statement SINGLE ROW FUNCTIONS JOIN OUTER JOIN INNER JOIN SELF JOIN GROUP FUNCTIONS SUBQUERIES 16 February 2019
Herhaling DDL CREATE ALTER DROP TABLE 16 February 2019
Herhaling DML TRANSACTIONS INSERT UPDATE DELETE BEGIN TRAN COMMIT ROLLBACK 16 February 2019
Openstaande vraag 1 OUTPUT parameter Kan het aanmaken van de tabel definitie vermeden worden? JA Voorbeeld in de les: 16 February 2019
Openstaande vraag 1 OUTPUT parameter Via temporary table select * into #afd_ins from afd where 1 = 0 INSERT afd OUTPUT INSERTED.* INTO #afd_ins SELECT ANR+100, naam from afd SELECT * FROM #afd_ins go 16 February 2019
Openstaande vraag 2 Bijhouden van historiek van statements uitgevoerd in SQL Server 2008 SQL Profiler Externe tools SELECT deqs.last_execution_time AS [Time], dest.TEXT AS [Query] FROM sys.dm_exec_query_stats AS deqs CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handle) AS dest ORDER BY deqs.last_execution_time DESC 16 February 2019
Openstaande vraag 3 Beheer van schijfruimte binnen SQL Server 16 February 2019
View Er zijn 2 soorten “tabellen”: Bevat geen data! = venster 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 SELECT-statement
View (2) Wanneer te gebruiken? Beperken van de toegang tot een databank Gebruikers toelaten eenvoudige selecties uit te voeren op resulaten bekomen uit ingewikkelde selecties Ophalen van gegevens uit meerdere tabellen Restrict updates of inserts tot bepaalde ranges
View (3) Een view mag geen order by bevatten Opvragen van gegevens gebeurt op dezelfde wijze als voor een tabel ALTER VIEW : wijzigen van een view DROP VIEW : verwijderen van een view 16 februari 2019
View - DDL column_list moet gebruikt worden als: CREATE VIEW view_name [(column_list)] AS select_statement column_list moet gebruikt worden als: Een column in de view gebaseerd is op een group function Dezelfde column naam meer dan één keer voorkomt Alias geven aan een column naam kan ook De wizard in SQL Server kan ook gebruikt worden 16 February 2019
View - DDL Aanpassen van een view Verwijderen van een view ALTER VIEW ~ CREATE VIEW Verwijderen van een view DROP VIEW Ook de afhankelijke views worden verwijderd 16 February 2019
View - System tables sys.views Standard stored procedures sp_helptext Ophalen van view definitie 16 February 2019
View - DML SELECT INSERT Analoog aan SELECT voor tables Toevoegen van data aan de onderliggende tabel Missing columns krijgen waarde NULL of de DEFAULT waarde WITH CHECK OPTION Restrict de inserts aan de voorwaarde in de WHERE-clause 16 February 2019
View – DML (voorbeeld) WITH CHECK OPTION: create view VW_Afd as select * from afd where afd.anr < 100 WITH CHECK OPTION insert into VW_Afd values (110,'VERKOOP') 16 February 2019
View - DML INSERT niet mogelijk indien Column lijst met columns van meerdere tabellen Column afgeleid van een group functie De view bevat een group by of distinct statement Column afgeleid van een constante of formula 16 February 2019
View - DML UPDATE DELETE ~ INSERT met views ~ DELETE met views Column afgeleid van een constante of formula wel toegestaan 16 February 2019
Oefeningen p 299 Beginners Guide to SQL Server 2008 16 February 2019
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 16 February 2019
Procedural extensions IF Statement WHILE Statement BREAK: stopt de complete while loop CONTINUE: stopt de huidige uitvoering van de while loop 16 February 2019
Procedural extensions CASE Statement 16 February 2019
Procedural extensions Locale variabelen Kunnen enkel gebruikt worden in de huidige batch DECLARE @variable DATATYPE Geheugen reserveren Waarde toekennen SET @variable = DesiredValue OF SELECT @variable = expression FROM table @@ variabelen zijn global variables 16 February 2019
Specific statements RETURN GOTO ~ BREAK in WHILE loop Beëindigt de batch GOTO 16 February 2019
Specific statements (2) RAISERROR Genereer een user-defined error message > 50000 WAITFOR DELAY Een bepaalde periode wachten TIME Tot een bepaald tijdstip wachten TIMEOUT Wachten op een message op een queue 16 February 2019
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 16 February 2019
Output Example WAITFOR 16 February 2019
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 ) 16 February 2019
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.' 16 February 2019
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 16 February 2019
ERROR Handling TRY/CATCH TRY: CATCH: Opvangen van de exception Behandelen van de exception 16 February 2019
Example TRY/CATCH USE sample; BEGIN TRY END TRY BEGIN CATCH END CATCH 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 16 February 2019
Stored Procedure Batch van statements als object bewaard in de database 16 February 2019
Stored Procedure System stored procedures Temporary stored procedures Eg sp_rename Komen we later op terug Temporary stored procedures Local: start naam met # Gebruik mogelijk door: Huidige user Huidige session Global: start naam met ## Gebruik mogelijk door Alle users Tot de creator’s sessie eindigt 16 February 2019
Stored Procedure Gebruik optie OUTPUT om een return waarde te gebruiken 16 February 2019
Stored Procedure and CLR 16 February 2019
User Defined Functions Gelijkaardig aan Stored Procedures Een output parameter is verplicht 16 February 2019
User Defined Functions Twee soorten Scalar-valued Eén resultaat Table-valued Een set van rijen als resultaat 16 February 2019
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) 16 February 2019
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 16 February 2019
Oefeningen p. 242 Beginners Guide to SQL Server 2008 16 February 2019
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 16 February 2019
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 16 februari 2019
DML Trigger Table_name | view_name: FOR | AFTER | INSTEAD OF: Object waarop de trigger gebouwd wordt FOR | AFTER | INSTEAD OF: Wanneer moet de actie uitgevoerd worden? INSERT | UPDATE | DELETE Na welk event moet de actie gebeuren? 16 February 2019
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: Bevat copies van de inserted rijen in de triggered tabel Deleted: Bevat copies van de deleted rijen in de triggered tabel Een UPDATE statement wordt behandeld als een DELETE gevolgd door een INSERT 16 February 2019
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 16 February 2019
Sequence van triggers sp_settriggerorder sp_helptrigger 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 16 February 2019
DDL Triggers ALL SERVER | DATABASE: EVENT_TYPE Scope van de trigger (op een database of op de gehele server) EVENT_TYPE http://msdn.microsoft.com/en-us/library/bb522542.aspx 16 February 2019
DDL Triggers EVENT_GROUP Verschillen met DML triggers http://msdn.microsoft.com/en-us/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 16 February 2019
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 16 February 2019
Oefeningen op Triggers p. 385 Beginners Guide to SQL Server 2008 16 February 2019
Oefeningen Muziekdatabase 16 februari 2019