Ακεραιότητα και Ασφάλεια Μέρος 1 Σχεδιασμός Βάσεων Δεδομένων με βάση slides από A. Silberschatz, H. Korth, S. Sudarshan, Database System Concepts, 5 th edition
Περιορισμοί πεδίου τιμών Περιορισμοί ακεραιότητας διασφαλίζουν από κατά λάθος καταστροφή της ΒΔ Διαβεβαιώνουν ότι μη εξουσιοδοτημένες αλλαγές στη ΒΔ δεν θα καταλήξουν σε απώλεια συνέπειας των δεδομένων. Περιορισμοί πεδίου τιμών η στοιχειώδης μορφή ακεραιότητας περιορισμού. Ελέγχουν τιμές που εισάγονται στη ΒΔ και ελέγχουν ερωτήσεις για να επιβεβαιώσουν ότι οι συγκρίσεις έχουν νόημα. Νέα πεδία τιμών μπορούν να δημιουργηθούν από υπάρχοντες τύπους δεδομένων Π.χ. create domain Dollars numeric(12, 2) create domain Pounds numeric(12,2) Δεν μπορούμε να αναθέσουμε (ή να συγκρίνουμε) μία τιμή τύπου Dollars σε τιμή τύπου Pounds. Ωστόσο, μπορούμε να μετατρέψουμε ένα τύπο ως εξής (cast r.a as Pounds)
Περιορισμοί πεδίου τιμών (2) Η έκφραση check σε SQL-92 επιτρέπει πεδία τιμών να περιοριστούν: Χρήση της έκφρασης check για να επιβεβαιώσουμε ότι το πεδίο τιμών hourly-wage επιτρέπει μόνο τιμές μεγαλύτερες από μία συγκεκριμένη τιμή. create domain hourly-wage numeric(5,2) constraint value-test check(value > = 4.00) Το πεδίο τιμών έχει το περιορισμό που επιβεβαιώνει ότι το hourly-wage >= 4.00 Μπορούμε να έχουμε σύνθετες συνθήκες στον έλεγχο πεδίου τιμών create domain AccountType char(10) constraint account-type-test check (value in ( Checking, Saving )) check (branch-name in (select branch-name from branch)) Η έκφραση constraint value-test είναι προαιρετική; Χρήσιμη για να δείξουμε πιο constraint παραβίασε κάποια ενημέρωση
Ακεραιότητα αναφορών Επιβεβαιώνει ότι μία τιμή που εμφανίζεται σε μία σχέση για ένα δεδομένο σύνολο χαρακτηριστικών επίσης εμφανίζεται για ένα συγκεκριμένο σύνολο γνωρισμάτων σε μία άλλη σχέση. Παράδειγμα: If Athens is a branch name appearing in one of the tuples in the account relation, Τυπικός ορισμός then there exists a tuple in the branch relation for branch Athens. Έστω r 1 (R 1 ) και r 2 (R 2 ) είναι σχέσεις με πρωτεύοντα κλειδιά K 1 και K 2 αντίστοιχα. Το υποσύνολο του R 2 είναι ξένο κλειδί (foreign key) που αναφέρει το K 1 στη σχέση r 1, εάν για κάθε πλειάδα t 2 στην r 2 πρέπει να υπάρχει μία πλειάδα t 1 στην r 1 τέτοια ώστε t 1 [K 1 ] = t 2 []. Ο περιορισμός αναφορικής ακεραιότητας καλείται επίσης υποσύνολο εξάρτησης τέτοιο ώστε να μπορεί να γραφεί ως (r 2 ) K1 (r 1 )
Έλεγχος ακεραιότητας αναφορών στη τροποποίηση Βάσης Δεδομένων Οι ακόλουθοι έλεγχοι πρέπει να γίνουν για να διατηρήσουν τους ακόλουθους περιορισμούς αναφορικής ακεραιότητας: (r 2 ) K (r 1 ) Insert. Εάν η πλειάδα t 2 εισαχθεί στο r 2, το σύστημα πρέπει να επιβεβαιώσει ότι υπάρχει μία πλειάδα t 1 στο r 1 τέτοια ώστε t 1 [K] = t 2 []. Δηλαδή t 2 [] K (r 1 ) Delete. Εάν η πλειάδα, t 1 διαγραφεί από r 1, το σύστημα πρέπει να υπολογίσει το σύνολο των πλειάδων στην r 2 που αναφέρουν το t 1 : Εάν το σύνολο δεν είναι κενό = t1[k] (r 2 ) Είτε η εντολή delete απορρίπτεται σαν λάθος, ή Οι εγγραφές που αναφέρουν το t 1 πρέπει να διαγραφούν από μόνες τους (διαδοχικές διαγραφές είναι δυνατές).
Τροποποίηση ΒΔ (2) Update. Δύο περιπτώσεις: Εάν μία εγγραφή t 2 ενημερώνεται στη σχέση r 2 και η ενημέρωση τροποποιεί τιμές για το ξένο κλειδί, τότε γίνεται ένας έλεγχος όμοιος με την περίπτωση της εισαγωγής: Έστω t 2 δηλώνει μία νέα τιμή της εγγραφής t 2. Το σύστημα πρέπει να επιβεβαιώσει ότι t 2 [] K (r 1 ) Εάν μία εγγραφή t 1 ενημερωθεί στη σχέση r 1, και η ενημέρωση τροποποιεί τις τιμές του πρωτεύοντος κλειδιού (K), τότε γίνεται ένας έλεγχος παρόμοιος με την περίπτωση της διαγραφής: 1. Το σύστημα πρέπει να υπολογίζει το σύνολο = t 1[K] (r 2) χρησιμοποιώντας τη παλιά τιμή t 1 (the value before the update is applied). 2. Εάν το σύνολο δεν είναι κενό 1. Η ενημέρωση μπορεί να απορριφθεί σαν λάθος, ή 2. Η ενημέρωση μπορεί διαδοχικά να γίνει στις εγγραφές συνόλου, ή 3. Οι εγγραφές του συνόλου μπορεί να διαγραφούν
Ακεραιότητα αναφορών σε SQL Πρωτεύοντα και ξένα κλειδιά μπορούν να οριστούν σαν μέρος της SQL εντολής create table : primary key ορίζει μία λίστα από γνωρίσματα που αποτελούν το πρωτεύον κλειδί. unique key : λίστα γνωρισμάτων που συνιστούν ένα υποψήφιο κλειδί. foreign key : λίστα γνωρισμάτων που συνιστούν το ξένο κλειδί και το όνομα της σχέσης που αφορά το ξένο κλειδί. By default, ένα ξένο κλειδί αφορά στο πρωτεύον κλειδί του αναφερόμενου πίνακα foreign key (account-number) references account Σύντομη μορφή για να καθορίσουμε μία απλή στήλη σαν ξένο κλειδί account-number char (10) references account Οι στήλες αναφοράς στον αναφερόμενο πίνακα μπορούν να οριστούν άμεσα Αλλά πρέπει να δηλωθούν σαν πρωτεύοντα/υποψήφια κλειδιά foreign key (account-number) references account(account-number)
Ακεραιότητα αναφορών σε SQL Παράδειγμα (1) create table customer (customer-name char(20), customer-street char(30), customer-city char(30), primary key (customer-name)) create table branch (branch-name char(15), branch-city char(30), assets integer, primary key (branch-name))
Ακεραιότητα αναφορών σε SQL Παράδειγμα (2) create table account (account-number char(10), branch-name char(15), balance integer, primary key (account-number), foreign key (branch-name) references branch) create table depositor (customer-name char(20), account-number char(10), primary key (customer-name, account-number), foreign key (account-number) references account, foreign key (customer-name) references customer)
Cascading Actions in SQL create table account... foreign key(branch-name) references branch on delete cascade on update cascade... ) Εξαιτίας της δήλωσης on delete cascade, Εάν μία διαγραφή πλειάδας στο branch καταλήξει σε παραβίαση του περιορισμού ακεραιότητα αναφοράς, η διαγραφή μεταβιβάζεται διαδοχικά στη σχέση account, διαγράφοντας την εγγραφή που αναφέρεται στο υποκατάστημα που διαγράφηκε. Cascading updates.
Cascading Actions in SQL (2) Εάν υπάρχει ακολουθία από εξαρτήσεις ξένων κλειδιών διαμέσου πολλαπλών σχέσεων, με το ορισμό on delete cascade για κάθε εξάρτηση, μία διαγραφή ή ενημέρωση στο ένα άκρο της αλυσίδας μπορεί να διαδοθεί σε όλη την αλυσίδα. Εάν μία διαδοχική ενημέρωση ή διαγραφή προκαλέσει παραβίαση περιορισμών που δεν μπορούν να διαχειριστούν από μία περαιτέρω διαδοχική λειτουργία, το σύστημα αναιρεί τη δοσοληψία. Σαν αποτέλεσμα, όλες οι αλλαγές που προκαλούνται από τη δοσοληψία και οι διαδοχικές της ενέργειες αναιρούνται. Η ακεραιότητα αναφορών ελέγχεται μόνο στο τέλος της δοσοληψίας Ενδιάμεσα βήματα επιτρέπονται να παραβιάσουν ακεραιότητας αναφοράς δεδομένου ότι μεταγενέστερα βήματα θα απομακρύνουν τη παραβίαση Διαφορετικά είναι αδύνατο να δημιουργήσουμε κάποιες καταστάσεις ΒΔ, π.χ. εισαγωγή δύο πλειάδων των οποίων τα ξένα κλειδιά δείχνουν το ένα το άλλο Π.χ. spouse attribute of relation married_person(name, address, spouse)
Ακεραιότητα αναφοράς σε SQL (2) Εναλλακτικά του cascading: on delete set null on delete set default Null τιμές στα γνωρίσματα του ξένου κλειδιού περιπλέκουν τη σημασιολογία ακεραιότητας αναφοράς στην SQL και είναι καλύτερα να αποφεύγονται χρησιμοποιώντας not null if any attribute of a foreign key is null, the tuple is defined to satisfy the foreign key constraint!
Triggers Ένας trigger είναι μία εντολή που εκτελείται αυτόματα από το σύστημα σαν αποτέλεσμα τροποποίησης της ΒΔ. Για να σχεδιάσουμε ένα μηχανισμό trigger, πρέπει να: Καθορίσουμε τις συνθήκες υπό τις οποίες εκτελείται ο trigger. Καθορίσουμε τις ενέργειες που λαμβάνονται όταν εκτελείται ο trigger. Triggers εισάγονται στο SQL στην SQL:1999, αλλά υποστηρίζονταν ακόμα νωρίτερα από τις περισσότερες ΒΔ χρησιμοποιώντας non-standard σύνταξη.
Trigger Παράδειγμα Υποθέτουμε ότι αντί να επιτρέπουμε λογαριασμούς με αρνητικά υπόλοιπα, η τράπεζα διαχειρίζεται overdrafts με το να Θέτει το υπόλοιπο λογαριασμού σε 0 Δημιουργεί ένα δάνειο στο ποσό του overdraft Δίνοντας στο δάνειο ένα αριθμό δανείου όμοιο με το αριθμό του overdrawn account Η συνθήκη εκτέλεσης του trigger είναι μία ενημέρωση της σχέσης account που καταλήγει σε μία αρνητική τιμή balance.
Trigger Example in SQL:1999 create trigger overdraft-trigger after update on account referencing new row as nrow for each row when nrow.balance < 0 begin atomic insert into borrower (select customer-name, account-number from depositor where nrow.account-number = depositor.account-number); insert into loan values (nrow.account-number, nrow.branch-name, nrow.balance); update account set balance = 0 where account.account-number = nrow.account-number end
Triggering Events and Actions in SQL Ένα γεγονός που προκαλεί την ενεργοποίηση trigger μπορεί να είναι insert, delete or update Triggers σε update μπορούν να περιοριστούν σε συγκεκριμένα γνωρίσματα E.g. create trigger overdraft-trigger after update of balance on account Τιμές γνωρισμάτων πριν και μετά την εκτέλεση ενός update μπορούν να αναφερθούν referencing old row as : for deletes and updates referencing new row as : for inserts and updates Triggers μπορούν να ενεργοποιηθούν πριν ένα συμβάν, το οποίο μπορεί να εξυπηρετήσει ως extra constraints. E.g. convert blanks to null. create trigger setnull-trigger before update on r referencing new row as nrow for each row when nrow.phone-number = set nrow.phone-number = null