MySQL Εργαστήριο #4 Διαβεβαιώσεις - Ενεργοποιητές Νίθνο Γηαηξάθνο Δξγαζηήξην Πιεξνθνξηαθψλ Σπζηεκάησλ, Τκήκα Πιεξνθνξηθήο, Παλεπηζηήκην Πεηξαηά (http://infolab.cs.unipi.gr)
Περιεχόμενα Σχλδεζε κε ηα πξνεγνχκελα Γηαβεβαηψζεηο Δλεξγνπνηεηέο 2
Περιεχόμενα Σχλδεζε κε ηα πξνεγνχκελα Γηαβεβαηψζεηο Δλεξγνπνηεηέο 3
Σχεσιακό Σχήμα Τν Σρεζηαθφ Σρήκα πνπ ρξεζηκνπνηήζεθε ζην εξγαζηήξην #2: Stars(StarID, StarName, StarAddress) Studios(StudioID, StudioName, StudioAddress) Movies(MovieID, MovieTitle, MovieLength, MovieWebsite, FilmType, StudioID) Stars_In(StarID, MovieID, StarringSequence) 4
Σύνθετοι Περιορισμοί Ακεραιότητας Υπνζέηνπκε ηνπο αθφινπζνπο πεξηνξηζκνχο ζην ζελάξην εθαξκνγήο γηα ηε ζηήιε StarringSequence Τν πεδίν StarringSequence ζα πξέπεη λα ιακβάλεη ηηκέο >0 Γελ επηηξέπεηαη δχν πξσηαγσληζηέο ζηελ ίδηα ηαηλία λα έρνπλ ηελ ίδηα ηηκή ζην πεδίν απηφ Γελ επηηξέπεηαη λα ππάξρεη εγγξαθή κε ηηκή k ζην πεδίν, φηαλ νη πξσηαγσληζηέο ηεο ηαηλίαο είλαη ιηγφηεξνη απφ θ 5
Περιεχόμενα Σχλδεζε κε ηα πξνεγνχκελα Γηαβεβαηψζεηο Δλεξγνπνηεηέο 6
Διαβεβαιώσεις - Assertions Οη δηαβεβαηψζεηο απνηεινχλ αληηθείκελα ηεο ΒΓ φπσο νη ζρέζεηο ή νη φςεηο Δπηηξέπεη ηνλ νξηζκφ ζπλζεθψλ: X: P(X) Έλα assertion νξίδεηαη σο εμήο: CREATE ASSERTION <name> CHECK (<condition>); Η ζπλζήθε (<condition>) κπνξεί λα αθνξά νπνηαδήπνηε ζρέζε ή ραξαθηεξηζηηθφ ηεο ΒΓ Καη αξρήλ έλα assertion ζα πξέπεη λα ειέγρεηαη ζε θάζε ηξνπνπνίεζε πνπ ζπκβαίλεη ζηε ΒΓ. Ωζηφζν έλα «έμππλν» ΣΓΒΓ ζα πξέπεη λα κπνξεί λα δηαθξίλεη πνηεο αιιαγέο ελδέρεηαη λα πξνθαιέζνπλ ηελ παξαβίαζε ελφο assertion. Η έθδνζε 5.1 ηνπ MySQL Community Server δελ ππνζηεξίδεη assertions 7
Διαβεβαιώσεις - Παράδειγμα Γελ επηηξέπεηαη δχν πξσηαγσληζηέο ζηελ ίδηα ηαηλία λα έρνπλ ηελ ίδηα ηηκή ζην πεδίν StarringSequence CREATE ASSERTION Constr_StarringSequence CHECK (NOT EXISTS (SELECT * FROM Stars_In S1, Stars_Ιn S2 WHERE S2.MovieID=S1.MovieID AND S2.StarringSequence=S1.StarringSequence AND S1.StarID <> S2.StarID ) ); 8
Περιεχόμενα Σχλδεζε κε ηα πξνεγνχκελα Γηαβεβαηψζεηο Δλεξγνπνηεηέο 9
Ενεργοποιητές - Διαβεβαιώσεις Οη δηαβεβαηψζεηο απνηεινχλ ηζρπξφ εξγαιείν γηα ηνλ έιεγρν ηθαλνπνίεζεο ζχλζεησλ πεξηνξηζκψλ αθεξαηφηεηαο, αιιά επηβάιινπλ πξφζζεην θφξην θαζψο ην ΣΓΒΓ ελδερνκέλσο λα κελ κπνξεί λα θαζνξίζεη κε αθξίβεηα ηηο πξνυπνζέζεηο ειέγρνπ ηνπο. Τα triggers επηηξέπνπλ ζην ρξήζηε λα θαζνξίζεη ηηο αθξηβείο ζπλζήθεο θαη ην αθξηβέο γεγνλφο ελεξγνπνίεζήο ηνπο Πέξαλ ηεο επηβνιήο ζχλζεησλ πεξηνξηζκψλ αθεξαηφηεηαο, επηηξέπνπλ ηελ απηφκαηε εθηέιεζε ιεηηνπξγηψλ/δηαδηθαζηψλ θαηά ηελ πξαγκαηνπνίεζε γεγνλφησλ 10
Εντολή Ορισμού Ενεργοποιητή CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt trigger_time: BEFORE ή AFTER trigger_event: INSERT ή UPDATE ή DELETE trigger_stmt: Block εντολών μεταξύ BEGIN END; Δπηπιένλ εληφο ηνπ trigger_stmt ρξεζηκνπνηνχκε : ηελ έθθξαζε NEW γηα λα αλαθεξφκαζηε ζηηο πιεηάδεο πνπ εηζήρζεζαλ ή ελεκεξψζεθαλ ηελ έθθξαζε OLD γηα λα αλαθεξζνχκε ζηελ πξψηεξε έθδνζε πιεηάδσλ πνπ αλαλεψζεθαλ ή δηαγξάθεθαλ 11
Περιορισμοί στη χρήση Ενεργοποιητών Σηελ 5.1 έθδνζε ηνπ MySQL Community Server ππάξρνπλ νη αθφινπζνη πεξηνξηζκνί ζρεηηθά κε ηα triggers: Γε κπνξνχλ λα νξηζηνχλ πεξηζζφηεξα ηνπ ελφο trigger κε ην ίδην trigger_time θαη ίδην trigger_event επί ηνπ ηδίνπ πίλαθα Γε κπνξεί λα νξηζηεί trigger επί temporary πίλαθα ή view Έλα trigger δελ κπνξεί λα ρξεζηκνπνηεί εληνιέο φπσο: Cancel θαη Rollback σζηφζν κπνξνχκε λα εκπνδίζνπκε κηα δνζνιεςία ηξνπνπνηψληαο ηηο ελεκεξσκέλεο πιεηάδεο έηζη ψζηε λα παξαβηάδνπλ θάπνην απιφ πεξηνξηζκφ αθεξαηφηεηαο Γελ κπνξεί λα πξαγκαηνπνηεζεί update εληφο ηεο ιεηηνπξγηθφηεηαο πνπ νξίδεηαη ζην trigger, ν πίλαθαο επί ηνπ νπνίνπ πξαγκαηνπνηείηαη ην γεγνλφο πνπ ελεξγνπνηεί ην trigger. Δπί παξαδείγκαηη: CREATE TRIGGER trig_name AFTER INSERT ON TABLE1 FOR EACH ROW BEGIN... UPDATE TABLE1 SET COLUMN1=VALUE WHERE...... END; 12
Ενεργοποιητές Παράδειγμα (Βήμα 1) Τν πεδίν StarringSequence ζα πξέπεη λα ιακβάλεη ηηκέο >0 DELIMITER @ CREATE TRIGGER Constr_StarringSequence BEFORE INSERT ON STARS_IN FOR EACH ROW BEGIN IF NEW.StarringSequence<=0 ΤΗΕΝ END IF; END; SET NEW.MovieID=NULL; Αλαθνξά ζηε λενεηζεξρφκελε πιεηάδα Πάληα πξηλ ην insert αιιάδνπκε ην ζχκβνιν ηέινπο εληνιήο Δθφζνλ δελ κπνξνχκε (βι. πξνεγνχκελε δηαθάλεηα) λα ρξεζηκνπνηήζνπκε CANCEL INSERT (γηα before insert trigger) ή ROLLBACK INSERT (γηα after insert trigger) εκπνδίδνπκε ηελ εηζαγσγή εμαζθαιίδνληαο ηελ παξαβίαζε ηνπ πεξηνξηζκνχ NOT NULL γηα κηα απφ ηηο ζηήιεο ηνπ πξσηεχνληνο θιεηδηνχ 13
Ενεργοποιητές Παράδειγμα (Βήμα 2) Γελ επηηξέπεηαη δχν πξσηαγσληζηέο ζηελ ίδηα ηαηλία λα έρνπλ ηελ ίδηα ηηκή ζην πεδίν απηφ DELIMITER @ CREATE TRIGGER Constr_StarringSequence BEFORE INSERT ON STARS_IN FOR EACH ROW BEGIN IF NEW.StarringSequence<=0 OR (SELECT COUNT(*) FROM Stars_In S WHERE S.MovieID= NEW.MovieID AND S.StarringSequence= NEW.StarringSequence)<> 0 ΤΗΕΝ SET NEW.MovieID=NULL; END IF; END; 14
Ενεργοποιητές Παράδειγμα (Βήμα 3) Γελ επηηξέπεηαη λα ππάξρεη εγγξαθή κε ηηκή k ζην πεδίν, φηαλ νη πξσηαγσληζηέο ηεο ηαηλίαο είλαη ιηγφηεξνη απφ θ DELIMITER @ CREATE TRIGGER Constr_StarringSequence BEFORE INSERT ON STARS_IN FOR EACH ROW BEGIN IF NEW.StarringSequence<=0 OR (SELECT COUNT(*) FROM Stars_In S WHERE S.MovieID= NEW.MovieID AND S.StarringSequence= NEW.StarringSequence)<> 0 OR (SELECT COUNT(*) FROM Stars_In S WHERE S.MovieID=NEW.MovieID)<>(NEW.StarringSequence-1) ΤΗΕΝ SET NEW.MovieID=NULL; END IF; END; 15
Εξωτερικές ενέργειες Μεξηθέο θνξέο θαηά ηελ ελεκέξσζε ηεο βάζεο δεδνκέλσλ απαηηείηαη ε ελεξγνπνίεζε θάπνησλ εμσηεξηθψλ ελεξγεηψλ, φπσο ε εθ λένπ παξαγγειία ελφο πξντφληνο φηαλ ε πνζφηεηά ηνπ πέζεη θάησ απφ κία ζπγθεθξηκέλε ηηκή ή ε ελεξγνπνίεζε ελφο δηαθφπηε. Οη triggers πξνθαλψο δελ κπνξνχλ λα ρξεζηκνπνηεζνχλ γηα ηελ θαηεπζείαλ πινπνίεζε εμσηεξηθψλ ελεξγεηψλ, ΑΛΛΑ κπνξνχλ λα ρξεζηκνπνηεζνχλ γηα ηελ θαηαγξαθή ζε έλαλ μερσξηζηφ πίλαθα ησλ ελεξγεηψλ πνπ πξέπεη λα ιεθζνχλ, θαη κπνξνχκε λα έρνπκε κηα εμσηεξηθή δηεξγαζία πνπ ζα ζαξψλεη ζπλερψο ηνλ πίλαθα θαη ζα δηεθπεξαηψλεη ηηο εμσηεξηθέο ελέξγεηεο.
Διαγραφή Ενεργοποιητή DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name SHOW TRIGGERS; Πξνθαλψο ηα triggers γίλνληαη απηφκαηα drop αλ γίλεη drop ν πίλαθαο επί ηνπ νπνίνπ νξίδνληαη
Πηγές περαιτέρω μελέτης http://dev.mysql.com/doc/refman/5.1/en/create-trigger.html http://dev.mysql.com/doc/refman/5.1/en/stored-program-restrictions.html http://infolab.stanford.edu/~ullman/fcdb/aut07/slides/cons.ppt 18