MySQL Εργαστήριο #5 Ενεργοποιητές (συνέχεια) Νίθνο Γηαηξάθνο Εξγαζηήξην Πιεξνθνξηαθώλ Σπζηεκάησλ, Τκήκα Πιεξνθνξηθήο, Παλεπηζηήκην Πεηξαηά (http://infolab.cs.unipi.gr)
Μελέτη Περίπτωσης 1 Θα ρξεζηκνπνηήζνπκε ην αθόινπζν Σρεζηαθό Σρήκα: Beers(name,manf) Sells(bar, beer, price) 2
Μελέτη Περίπτωσης 1 1 Αληί ηεο παξαβίαζεο ηνπ πεξηξηoζκνύ μέλνπ θιεηδηνύ, επηζπκνύκε όηαλ εηζέξρεηαη ζηνλ πίλαθα Sells εγγξαθή beer πνπ δελ εκθαλίδεηαη ζηνλ πίλαθα Beers λα εηζάγεηαη απηόκαηα κε θελό ην πεδίν ηνπ θαηαζθεπαζηή (manf) CREATE TRIGGER BeerTrig BEFORE INSERT ON Sells IF (NEW.beer NOT IN (SELECT name FROM Beers)) THEN INSERT INTO Beers(name) VALUES(NEW.beer); END IF; 3
Μελέτη Περίπτωσης 2 Θα ρξεζηκνπνηήζνπκε ην αθόινπζν Σρεζηαθό Σρήκα: NewsCategories(catID, catname, NewsCount) News(NewsID, catid, title, text) 4
Μελέτη Περίπτωσης 2 1 Τν ραξαθηεξηζηηθό NewsCount θάζε θαηεγνξίαο ζα πξέπεη λα ελεκεξώλεηαη κε θάζε λέα θαηαρώξεζε είδεζεο CREATE TRIGGER newscounter AFTER INSERT ON News UPDATE NewsCategories SET NewsCount=(SELECT count(*) FROM News WHERE catid=new.catid) WHERE catid=new.catid; 5
Μελέτη Περίπτωσης 2 2 Τν ραξαθηεξηζηηθό NewsCount θάζε θαηεγνξίαο ζα πξέπεη επίζεο λα ελεκεξώλεηαη κε θάζε αθαίξεζε είδεζεο CREATE TRIGGER newscounter AFTER DELETE ON News UPDATE NewsCategories SET NewsCount= NewsCount-1 WHERE catid=old.catid; 6
Μελέτη Περίπτωσης 3 Θα ρξεζηκνπνηήζνπκε ην αθόινπζν Σρεζηαθό Σρήκα: Employer(ID, name, address, salary, num_of_children) Audit_table (username, timestamp, empid, old_salary, new_salary) 7
Μελέτη Περίπτωσης 3 1 Καηαγξαθή ησλ κηζζνινγηθώλ αιιαγώλ κε ηαπηόρξνλε επηζύλαςε ηνπ ρξήζηε πνπ πξνέβε ζηελ αιιαγή θαη ηεο ώξαο-κέξαο πνπ πξαγκαηνπνηήζεθε CREATE TRIGGER Audit AFTER UPDATE ON Employer IF (NEW.salary <> OLD.salary) THEN INSERT INTO Audit_table VALUES (CURRENT_USER(), NOW(), NEW.ID, NEW.Salary, OLD. Salary); END IF; 8
Μελέτη Περίπτωσης 3 2 Γηα θάζε παηδί πνπ απνθηά θάπνηνο εξγαδόκελνο ιακβάλεη 5% αύμεζε ζηνλ ησξηλό κηζζό ηνπ (πξνθαλώο ε αιιαγή πνπ ζα πξνθιεζεί από απηό ην trigger ζα ελεξγνπνηήζεη θαη ην πξνεγνύκελν ) CREATE TRIGGER child_bonus AFTER UPDATE ON Employer IF (NEW.num_of_children <> OLD.num_of_children) THEN UPDATE employer SET salary= salary + salary*(new.num_of_children-old.num_of_children)*0.05 WHERE ID=NEW.ID; END IF; 9
Μελέτη Περίπτωσης 4 Θα ρξεζηκνπνηήζνπκε ην αθόινπζν Σρεζηαθό Σρήκα: Student(ID, name, address, GPA, sizehs) Campus(location, enrollment, rank) Apply(ID, location, date, major, decision) 10
Μελέτη Περίπτωσης 4 1 Μηα αίηεζε θνηηεηή γηα ην Berkeley campus κε GPA>3.9 θαη SizeHS>1500 γίλεηαη απηόκαηα απνδεθηή CREATE TRIGGER AutoAccept AFTER INSERT ON Apply IF (NEW.location = 'Berkeley' AND 3.9 < (SELECT GPA FROM Student WHERE ID = NEW.ID) AND 1500 < (SELECT sizehs FROM Student WHERE ID = NEW.ID)) THEN UPDATE Apply SET decision = 'Y' WHERE ID = NEW.ID AND location = NEW.location AND `date` = NEW.`date`; END IF; 11
Μελέτη Περίπτωσης 4 2 Αλ νη εγγξαθέο ζε θάπνην campus μεπεξάζνπλ ηηο 7000, ηόηε ζα πξέπεη λα δηαγξαθνύλ όιεο νη αηηήζεηο πνπ έγηλαλ κεηά ηηο 25/2/2009 θαη γηα εθείλεο πνπ έγηλαλ πξηλ από ηε ζπγθεθξηκέλε εκεξνκελία θαη είρε παξζεί ζεηηθή απόθαζε, ε απόθαζε λα αιιάμεη ζε «απξνζδηόξηζηε» CREATE TRIGGER TooMany AFTER UPDATE ON Campus IF (OLD.enrollment <= 7,000 AND NEW.enrollment > 7,000) THEN DELETE FROM Apply WHERE location = NEW.location AND date > 25/2/2009; UPDATE Apply SET decision = 'U' WHERE location = NEW.location AND decision = 'Y'; END IF; 12
Αναφορές http://philip.greenspun.com/sql/triggers.html http://infolab.stanford.edu/~ullman/fcdb/jw-notes06/constraints.html http://infolab.stanford.edu/~ullman/fcdb/aut07/slides/cons.ppt 13