Department of Computer Science University of Cyprus EPL342 Databases Lecture 18: Internal DB Programming I Views/Assertions/Triggers (Chapter 8.7-8.8, Elmasri-Navathe 5ED + ΤransactSQL Reference Guide http://msdn.microsoft.com/en-us/library/bb510741.aspx) Demetris Zeinalipour http://www.cs.ucy.ac.cy/courses/epl342 18-1
Πεξηερόκελν Γηάιεμεο Οινθιήξσζε Γηάιεμεο 17. Κεθάιαην 8.7-8.8: SQL Programming I Όςεηο (Views) ζε SQL θαη TSQL Βεβαηώζεηο (Assertions) ζε SQL Σθαλδάιεο (Triggers) ζε SQL θαη TSQL 18-2
Όςεηο ζε SQL (Views in SQL) Μηα όςε είλαη έλαο λνεηόο πίλαθαο ( virtual table) ν νπνίνο παξάγεηαη από άιινπο θαλνληθνύο πηλάθεο (Base-Tables) Σηελ πξάμε κηα όςε δελ είλαη ηίπνηα πεξηζζόηεξν από κηα απνζεθεπκέλε επεξώηεζε SELECT! Π.ρ., a) CREATE VIEW dbo.employee_names AS SELECT FNAME, LNAME FROM EMPLOYEE b) SELECT * FROM dbo.employee_names c) DROP VIEW dbo.employee_view 18-3
Όςεηο ζε SQL (Χαξαθηεξηζηηθά) Χαξαθηεξηζηηθά Όςεσλ Μπνξνύλ λα ρξεζηκνπνηεζνύλ όπσο ηα ππόινηπα tables (ζε επεξσηήζεηο, ζπλελώζεηο, ζπλαζξνίζεηο, θηι) Πεξηέρνπλ ΠΑΝΤΑ ελεκεξσκέλα δεδνκέλα. Τα δεδνκέλα κηαο όςεο ΓΔΝ απνζεθεύνληαη θπζηθά θάπνπ (ηα δεδνκέλα απνζεθεύνληαη ζηα base tables) Μπνξνύκε λα εθηειέζνπκε αιιαγέο ζε κηα όςε (INSERT/UPDATE/DELETE) Δλεκεξώζεηο γίλνληαη κόλν εάλ ε όςε νξίδεηαη από έλα basetables (όρη από πεξηζζόηεξα base-tables) Δπίζεο, όςεηο κε aggregates & groupby ΓΔΝ ελεκεξώλνληαη. Δθηέιεζε κηαο Όςεο ΓΔΝ είλαη πην γξήγνξν από κηα εθηέιεζε ηεο αληίζηνηρεο SELECT επεξώηεζεο. Απηό επεηδή ην VIEW εηζάγεη θάπνηo overhead. 18-4
Όςεηο ζε SQL (Πιενλεθηήκαηα) Πιενλεθηήκαηα Όςεσλ Μεηώλνπλ ηελ πνιππινθόηεηα αλάπηπμεο: Απηό ζπκβαίλεη επεηδή κπνξνύκε λα αλαπαξαζηήζνπκε πεξίπινθεο επεξσηήζεηο σο λνεηνύο πίλαθεο. Αζθάιεηα: Δπηηξέπνπλ ζηνλ DBA λα εθζέζεη κόλν ηηο ζηήιεο πνπ επηζπκεί ζε ζπγθεθξηκέλεο νκάδεο ρξεζηώλ. Όπσο όιεο νη δπλαηόηεηεο, νη όςεηο πξέπεη λα ρξεζηκνπνηνύληαη κε πξνζνρή θαη όηαλ ζεσξνύληαη απαξαίηεηεο! 18-5
Όςεηο ζε SQL (Παξάδεηγκα Όςεο ζε TSQL) Όςε κε ζπλάζξνηζε ζην SELECT. CREATE VIEW Emp_Sal2 AS SELECT dno, SUM(salary) AS sumname FROM Employee GROUP BY dno Δπηζεκάλζεηο: Σε πεξίπησζε ελεκέξσζεο ηνπ πίλαθα EMPLOYEE ελεκεξώλεηαη απηόκαηα ε όςε. Η ίδηα ε όςε ΓΔΝ κπνξεί λα ελεκεξσζεί από ηνλ ρξήζηε κε INSERT/UPDATE/DELETE (ιόγσ ηνπ aggregate / group-by ην). Π.ρ., UPDATE Emp_Sal2 SET dno=1 Πξηλ ηελ Δλεκέξσζε ηνπ EMPLOYEE Μεηά ηελ Δλεκέξσζε ηνπ EMPLOYEE 18-6
Όςεηο ζε SQL (Σύληαμε Όςεσλ ζε TSQL) CREATE VIEW [<schema-name>].<view.name> [(columnname-list>)] [WITH ENCRYPTION] [[,] SCHEMABINDING] AS <SELECT statement> [WITH CHECK OPTION] [;] <schema-name>: dbo (default), guest, θηι. <column-name-list>: νλόκαηα γλσξηζκάησλ ηεο λέαο όςεο WITH ENCRYPTION: Ο SQL θώδηθαο ηεο όςεο θσδηθνπνηείηαη κέζα ζηε βάζε γηα λα κελ κπνξεί λα ηνλ δεη θαλείο (νύηε θαη εζείο!). Γηα λα δείηε ηνλ θώδηθα κε-θσδηθνπνηεκελ. όςεσλ: EXEC sp_helptext view_name; SCHEMABINDING: Γηαζθαιίδεη όηη ε όςε ΓΔΝ ζα κείλεη νξθαλή ζε πεξίπησζε δνκηθώλ αιιαγώλ ζηα basetables. Π.ρ., εάλ δηαγξαθεί ν πίλαθαο πάλσ ζηνλ νπνίν νξίδεηαη ε όςε. WITH CHECK OPTION: Καηά ηελ ηξνπνπνίεζε (insert(x)/update(χ)) κηαο όςεο ειέγρεη όηη ην X είλαη ζύκθσλα κε ην WHERE ηνπ <SELECT statement> 18-7
Όςεηο ζε SQL (Παξάδεηγκα Όςεο ζε TSQL) USE AdventureWorks; -- change to specified database context GO -- not tsql cmd. Instructs SQLStudio to execute statements. IF OBJECT_ID ('dbo.seattleonly', 'V') IS NOT NULL DROP VIEW dbo.seattleonly; View Identifier GO OBJECT_ID (int) uniquely identifies objects in DB CREATE VIEW dbo.seattleonly WITH SCHEMABINDING - structural changes to Person.Contact (e.g., drop) will be prohibited. AS SELECT c.lastname, c.firstname FROM Person.Contact AS c WHERE c.city = 'Seattle' WITH CHECK OPTION; -- any addition to this view has to obey the WHERE condition(i.e., c.city= Seattle ) GO 18-8
Βεβαηώζεηο ζε SQL (CREATE ASSERTION) - OXI ΣΔ TSQL Μηα Βεβαίσζε (ASSERTION) είλαη έλαο θαλόλαο πνπ νξίδεηαη πάλσ από πνιιαπινύο πίλαθεο. Απηόο ν θαλόλαο ειέγρεηαη θαηά νπνηαδήπνηε αιιαγή ηεο θαηάζηαζεο ησλ εκπιεθόκελσλ Πηλάθσλ (INSERT, UPDATE) Αληίζηνηρν κε ην CHECK πνπ νξίδεηαη σζηόζν κόλν πάλσ ζε έλα πίλαθα: Π.ρ. age int check (age>20); Δπηζεκάλζεηο Τα Assertions ΓΔΝ νξίδνληαη ζε TSQL άιια νξίδνληαη ζε αξθεηέο άιιεο βάζεηο όπσο PostgreSQL Τα Assertions είλαη όκνηα κε ηηο ζθαλδάιεο ηα νπνία ζα κειεηήζνπκε ζε ιίγν. 18-9
Βεβαηώζεηο ζε SQL ASSERTION: Παξάδεηγκα Σεκαζηνινγηθόο Πεξηνξηζκόο: Ο κηζζόο ελόο employee ΓΔΝ πξέπεη λα είλαη κεγαιύηεξνο από ηνλ κηζζό ηνπ manager ηνπ department ζην νπνίν δνπιεύεη ν employee CREATΕ ASSERTION SALARY_CONSTRAINT CHECK (NOT EXISTS Σπλζήθε Βεβαίσζεο ) (SELECT * FROM EMPLOYEE E, EMPLOYEE M, DEPARTMENT D WHERE E.DNO=D.NUMBER AND D.MGRSSN=M.SSN ) AND E.SALARY > M.SALARY Όλνκα Βεβαίσζεο 18-10
Σθαλδάιεο ζε SQL (SQL Triggers) Μηα Σθαλδάιε (Τrigger) νξίδεη κηα αληίδξαζε ηεο βάζεο δεδνκέλσλ ζε πεξίπησζε αιιαγώλ πιεηάδσλ* (INSERT, DELETE, UPDATE) ζε θάπνηνπο πξνζδηνξηζκέλνπο πίλαθεο. ASSERTIONS: απαγνξεύνπλ θάπνηα θαηάζηαζε Π.ρ., o κηζζόο ηνπ ππαιιήινπ ΓΔΝ κπνξεί λα είλαη κεγαιύηεξνο από απηόλ ηνπ supervisor ηνπ. TRIGGERS: δελ ζεκαίλεη απαξαίηεηα όηη απαγνξεύνπλ κηα θαηάζηαζε, άπια νξίδνπλ αθνινπζία εληνιώλ πνπ πξέπεη λα ελεξγνπνηεζεί όηαλ ηθαλνπνηεζεί κηα ζπλζήθε π.ρ., όηαλ πξνζηεζνύλ/αθαηξεζνύλ ιεθηά από ηνλ ινγαξηαζκό θάπνηνπ πειάηε, ζηείιε email ζηνλ πειάηε γηα λα ηνλ ελεκεξώζεηο Τν SELECT, TRUNCATE ή BULK INSERT δελ ελεξγνπνηνύλ EPL342: Databases ηηο ζθαλδάιεο - Demetris Zeinalipour ζε (University TSQL. of Cyprus) 18-11
Καηεγνξίεο Σθαλδάισλ Τα triggers ρσξίδνληαη ζε δπν θαηεγνξίεο: DDL Triggers: Οξίδνπλ ηελ αληίδξαζε ζε δνκηθέο αιιαγέο (DROP, ALTER, θηι). DML Τriggers: Οξίδνπλ ηελ αληίδξαζε ζε αιιαγέο πάλσ ζε πιεηάδεο κηαο ζρέζεο ή όςεο (INSERT, UPDATE, DELETE). Θα επηθεληξσζνύκε κόλν ζηα DML Triggers. Σεκεηώζηε όηη ηα Triggers είλαη νπζηαζηηθά «κηθξά πξνγξάκκαηα ζε (T)SQL» τα οποία καλούνται ΑΥΤΟΜΑΤΑ μόλις ενεργοποιηθεί η ορισμένη σσνθήκη η οποία ιστύει πάνω σε κάποιοσς πίνακες ή όψεις. Τα triggers ΔΕΝ μπορούμε να τα καλέσοσμε (invoke) αστόνομα (π.τ., με SELECT ή EXEC) 18-12
Απιό Παξάδεηγκα Trigger ζε TSQL -- Παξάδεηγκα ζθαλδάιεο πνπ παξάγεη κήλπκα ιάζνπο όπνηε γίλεη εηζαγσγή/δηαγξαθή δεδνκέλσλ από ην Δmp1 Table USE epl342; GO IF OBJECT_ID ('Reminder1', 'TR') trigger IS NOT NULL DROP TRIGGER Reminder1; GO CREATE TRIGGER reminder1 ON Emp1 AFTER INSERT, UPDATE AS -- ακολοσθούν οι εντολές ποσ πρέπει να εκτελεστούν RAISERROR ('Notify Customer Relations', 16, 1); GO Severity: 0-18: Specified by User 20-25: FATAL Errors 18-13 State: 0-255
Απιό Παξάδεηγκα Trigger ζε TSQL Καηά ηελ εηζαγσγή/ελεκέξσζε δεδνκέλσλ ζηνλ Πίλαθα Emp1 επηζηξέθεηαη κήλπκα ιάζνπο δηόηη ελεξγνπνηείηαη ε ζθαλδάιε. 18-14
Σύληαμε Σθαλδάιεο ζε TSQL CREATE TRIGGER <trigger-name> ON [schema-name>.] <table view-name> [WITH ENCRYPTION] -- trigger code is encrypted in DB [EXECUTE AS <CALLER SELF <user>] -- Default: Caller (of change), SELF: Creator of Trigger, user: {{FOR AFTER} <[DELETE] [,] [INSERT] [,] [UPDATE]>} AS <sql-statements> FOR AFTER: Αλαθέξνληαη ζην ίδην πξάγκα θαη πξνζηίζεηαη γηα λα είλαη πην επαλάγλσζηνο ν θώδηθαο, π.ρ., AFTER DELETE AS IF EXISTS (SELECT.) BEGIN SQL Statements.. END Πεξηζζόηεξα: http://msdn.microsoft.com/e n-us/library/ms188354.aspx 18-15
Σύληαμε Σθαλδάιεο ζε TSQL Άιιεο Χξήζηκεο Πιεξνθνξίεο γηα TRIGGERS Πξνζσξηλή Απελεξγνπνίεζε Σθαλδάιεο ALTER TABLE <table-name> <ENABLE DISABLE> TRIGGER <ALL <triggername>> Οη ζθαλδάιεο κπνξεί λα θαινύληαη αλαδξνκηθά κέρξη θαη 32 επίπεδα. Η εθηέιεζε κηαο ζθαλδάιεο κπνξεί λα πξνθαιέζεη ηελ αιπζηδσηή εθηέιεζε άιισλ ζθαλδαιώλ κε απξόζκελα απνηέιεζκα ζπκεζείηε ην ON DELETE CASCADE παξάδεηγκα ην νπνίν κπνξνύζε λα ζβήζεη όιν ηνλ πίλαθα ησλ EMPLOYEEs. 18-16
Γηαδηθαζηηθόο Πξνγξακκαηηζκόο κέζα ζηελ Βάζε Γεδνκέλσλ! Οη Σθαλδάιεο ζε κηα βάζε δεδνκέλσλ κπνξεί λα γίλνπλ αξθεηά πεξίπινθεο κε ηελ ρξήζε εληνιώλ δηαδηθαζηηθνύ πξνγξακκαηηζκνύ πνπ ζα δνύκε ζηελ εξρόκελε δηάιεμε. Γηα παξάδεηγκα κπνξεί λα νξίδνληαη επαλαιήςεηο, ζπλζήθεο έιεγρνπ, κεηαβιεηέο, ζπλαξηήζεηο θαη πάξα πνιιά άιια. Απηέο νη δνκέο πξνγξακκαηηζκνύ είλαη κέξνο επεθηάζεσλ ηεο SQL (π.ρ., TSQL, PL/SQL (Oracle)). Σηα πιαίζηα ηνπ εξγαζηεξίνπ ζα δείηε θαη ηελ ρξήζε ησλ ελδηάκεζσλ πηλάθσλ ησλ Triggers: Inserted (γηα Insert), Deleted (γηα Deletes), Inserted+Deleted (γηα Updates). 18-17