Τι είναι το Trigger στο PL / SQL;
Τα TRIGGERS είναι αποθηκευμένα προγράμματα που ενεργοποιούνται αυτόματα από τη μηχανή Oracle όταν οι Δηλώσεις DML όπως εισαγωγή, ενημέρωση, διαγραφή εκτελούνται στο τραπέζι ή συμβαίνουν κάποια συμβάντα. Ο κωδικός που πρέπει να εκτελεστεί σε περίπτωση σκανδάλης μπορεί να οριστεί σύμφωνα με την απαίτηση. Μπορείτε να επιλέξετε το συμβάν στο οποίο πρέπει να ενεργοποιηθεί η σκανδάλη και το χρονοδιάγραμμα της εκτέλεσης. Ο σκοπός της ενεργοποίησης είναι να διατηρηθεί η ακεραιότητα των πληροφοριών στη βάση δεδομένων.
Σε αυτό το σεμινάριο, θα μάθετε-
- Οφέλη των ενεργοποιητών
- Τύποι σκανδάλης στο Oracle
- Πώς να δημιουργήσετε έναυσμα
- : ΝΕΟ και: ΠΑΛΙΑ Ρήτρα
- INSTEAD OF Trigger
- Σύνθετη σκανδάλη
Οφέλη των ενεργοποιητών
Ακολουθούν τα οφέλη των ενεργοποιήσεων.
- Αυτόματη δημιουργία ορισμένων παραγόμενων τιμών στηλών
- Επιβολή ακεραιότητας αναφοράς
- Καταγραφή συμβάντων και αποθήκευση πληροφοριών σχετικά με την πρόσβαση στο τραπέζι
- Έλεγχος
- Σύγχρονη αναπαραγωγή πινάκων
- Επιβολή αδειών ασφαλείας
- Πρόληψη μη έγκυρων συναλλαγών
Τύποι σκανδάλης στο Oracle
Οι κανόνες ετικέτας μπορούν να ταξινομηθούν βάσει των ακόλουθων παραμέτρων.
- Η ταξινόμηση βασίζεται στο χρονοδιάγραμμα
- ΠΡΙΝ ΤΗΝ Ενεργοποίηση: Ενεργοποιείται πριν συμβεί το καθορισμένο συμβάν.
- ΜΕΤΑ ΤΗ Σκανδάλη: Ενεργοποιείται μετά την εμφάνιση του καθορισμένου συμβάντος.
- INSTEAD OF Trigger: Ένας ειδικός τύπος. Θα μάθετε περισσότερα για τα περαιτέρω θέματα. (μόνο για DML)
- Ταξινόμηση με βάση το επίπεδο
- ΕΝΕΡΓΟΠΟΙΗΣΗ επιπέδου ΔΗΛΩΣΗΣ: Ενεργοποιεί μία φορά για την καθορισμένη δήλωση συμβάντος
- Ενεργοποίηση επιπέδου ROW: Ενεργοποιείται για κάθε εγγραφή που επηρεάστηκε στο καθορισμένο συμβάν. (μόνο για DML)
- Η ταξινόμηση βασίζεται στο Γεγονός
- DML Trigger: Ενεργοποιείται όταν έχει καθοριστεί το συμβάν DML (INSERT / UPDATE / DELETE)
- DDL Trigger: Ενεργοποιείται όταν έχει καθοριστεί το συμβάν DDL (ΔΗΜΙΟΥΡΓΙΑ / ALTER)
- DATABASE Trigger: Ενεργοποιείται όταν έχει καθοριστεί το συμβάν βάσης δεδομένων (LOGON / LOGOFF / STARTUP / SHUTDOWN)
Έτσι κάθε σκανδάλη είναι ο συνδυασμός των παραπάνω παραμέτρων.
Πώς να δημιουργήσετε έναυσμα
Παρακάτω είναι η σύνταξη για τη δημιουργία ενός κανόνα ετικέτας.
CREATE [ OR REPLACE ] TRIGGER[BEFORE | AFTER | INSTEAD OF ][INSERT | UPDATE | DELETE… ]ON [FOR EACH ROW][WHEN ]DECLARE BEGIN EXCEPTION END;
Επεξήγηση σύνταξης:
- Η παραπάνω σύνταξη δείχνει τις διαφορετικές προαιρετικές δηλώσεις που υπάρχουν στη δημιουργία σκανδάλης.
- ΠΡΙΝ / ΜΕΤΑ θα καθορίσει τους χρόνους του συμβάντος.
- ΕΙΣΑΓΩΓΗ / ΕΝΗΜΕΡΩΣΗ / ΛΟΓΟΤΥΠΟ / ΔΗΜΙΟΥΡΓΙΑ / κλπ. θα καθορίσει το συμβάν για το οποίο πρέπει να ενεργοποιηθεί η σκανδάλη.
- Ο όρος ON θα καθορίσει σε ποιο αντικείμενο ισχύει το προαναφερθέν συμβάν. Για παράδειγμα, αυτό θα είναι το όνομα του πίνακα στο οποίο ενδέχεται να προκύψει το συμβάν DML στην περίπτωση του Trigger DML.
- Η εντολή "FOR EACH ROW" θα καθορίσει τη σκανδάλη επιπέδου ROW.
- ΟΤΑΝ ο όρος θα καθορίσει την πρόσθετη κατάσταση στην οποία πρέπει να ενεργοποιηθεί η σκανδάλη.
- Το τμήμα δήλωσης, το μέρος εκτέλεσης, το τμήμα χειρισμού εξαιρέσεων είναι ίδιο με αυτό των άλλων μπλοκ PL / SQL. Το τμήμα δήλωσης και το τμήμα χειρισμού εξαιρέσεων είναι προαιρετικά
: ΝΕΟ και: ΠΑΛΙΑ Ρήτρα
Σε ένα επίπεδο ενεργοποίησης, η σκανδάλη ενεργοποιείται για κάθε σχετική σειρά. Και μερικές φορές απαιτείται να γνωρίζουμε την τιμή πριν και μετά τη δήλωση DML.
Η Oracle έχει παράσχει δύο ρήτρες στη σκανδάλη επιπέδου RECORD για τη διατήρηση αυτών των τιμών. Μπορούμε να χρησιμοποιήσουμε αυτές τις ρήτρες για να αναφερθούμε στις παλιές και νέες τιμές μέσα στο σώμα της σκανδάλης.
- : ΝΕΟ - Διατηρεί μια νέα τιμή για τις στήλες του βασικού πίνακα / προβολή κατά την εκτέλεση της ενεργοποίησης
- : ΠΑΛΙΟ - Διατηρεί την παλιά τιμή των στηλών του βασικού πίνακα / προβολής κατά την εκτέλεση της ενεργοποίησης
Αυτή η ρήτρα πρέπει να χρησιμοποιηθεί με βάση το συμβάν DML. Στον παρακάτω πίνακα θα προσδιοριστεί ποια ρήτρα είναι έγκυρη για ποια δήλωση DML (INSERT / UPDATE / DELETE).
ΕΙΣΑΓΕΤΕ | ΕΚΣΥΓΧΡΟΝΙΖΩ | ΔΙΑΓΡΑΦΩ | |
:ΝΕΟΣ | ΕΓΚΥΡΟΣ | ΕΓΚΥΡΟΣ | ΜΗ ΕΓΚΥΡΟ. Δεν υπάρχει νέα τιμή σε περίπτωση διαγραφής. |
:ΠΑΛΑΙΟΣ | ΜΗ ΕΓΚΥΡΟ. Δεν υπάρχει παλιά τιμή στην περίπτωση εισαγωγής | ΕΓΚΥΡΟΣ | ΕΓΚΥΡΟΣ |
INSTEAD OF Trigger
Το "INSTEAD OF trigger" είναι ο ειδικός τύπος σκανδάλης. Χρησιμοποιείται μόνο σε ενεργοποιητές DML. Χρησιμοποιείται όταν οποιοδήποτε συμβάν DML πρόκειται να συμβεί στην περίπλοκη προβολή.
Εξετάστε ένα παράδειγμα στο οποίο μια προβολή γίνεται από 3 βασικούς πίνακες. Όταν εκδίδεται οποιοδήποτε συμβάν DML σε αυτήν την προβολή, αυτό θα είναι άκυρο επειδή τα δεδομένα λαμβάνονται από 3 διαφορετικούς πίνακες. Έτσι σε αυτό το INSTEAD OF trigger χρησιμοποιείται. Το INSTEAD OF trigger χρησιμοποιείται για την άμεση τροποποίηση των βασικών πινάκων αντί για την τροποποίηση της προβολής για το συγκεκριμένο συμβάν.
Παράδειγμα 1 : Σε αυτό το παράδειγμα, πρόκειται να δημιουργήσουμε μια περίπλοκη προβολή από δύο βασικούς πίνακες.
- Ο πίνακας_1 είναι πίνακας emp και
- Ο πίνακας_2 είναι πίνακας τμήματος.
Τότε θα δούμε πώς χρησιμοποιείται το INSTEAD OF trigger για την έκδοση ΕΝΗΜΕΡΩΣΗΣ της δήλωσης λεπτομέρειας τοποθεσίας σε αυτήν την περίπλοκη προβολή. Θα δούμε επίσης πώς τα: ΝΕΑ και: ΠΑΛΙΑ είναι χρήσιμα σε σκανδάλη.
- Βήμα 1: Δημιουργία πίνακα "emp" και "dept" με κατάλληλες στήλες
- Βήμα 2: Συμπλήρωση του πίνακα με τιμές δείγματος
- Βήμα 3: Δημιουργία προβολής για τον παραπάνω πίνακα
- Βήμα 4: Ενημέρωση προβολής πριν από το αντί για ενεργοποίηση
- Βήμα 5: Δημιουργία αντί για σκανδάλη
- Βήμα 6: Ενημέρωση προβολής μετά αντί για ενεργοποίηση
Βήμα 1) Δημιουργία πίνακα "emp" και "dept" με κατάλληλες στήλες
CREATE TABLE emp(emp_no NUMBER,emp_name VARCHAR2(50),salary NUMBER,manager VARCHAR2(50),dept_no NUMBER);/CREATE TABLE dept(Dept_no NUMBER,Dept_name VARCHAR2(50),LOCATION VARCHAR2(50));/
Επεξήγηση κώδικα
- Γραμμή κώδικα 1-7 : Δημιουργία πίνακα «emp».
- Γραμμή κώδικα 8-12 : Δημιουργία πίνακα "dept".
Παραγωγή
Δημιουργήθηκε πίνακας
Βήμα 2) Τώρα από τη δημιουργία του πίνακα, θα συμπληρώσουμε αυτόν τον πίνακα με τιμές δείγματος και Δημιουργία προβολών για τους παραπάνω πίνακες.
BEGININSERT INTO DEPT VALUES(10,‘HR’,‘USA’);INSERT INTO DEPT VALUES(20,'SALES','UK’);INSERT INTO DEPT VALUES(30,‘FINANCIAL',‘JAPAN');COMMIT;END;/BEGININSERT INTO EMP VALUES(1000,'XXX5,15000,'AAA',30);INSERT INTO EMP VALUES(1001,‘YYY5,18000,‘AAA’,20) ;INSERT INTO EMP VALUES(1002,‘ZZZ5,20000,‘AAA',10);COMMIT;END;/
Επεξήγηση κώδικα
- Γραμμή κώδικα 13-19 : Εισαγωγή δεδομένων στον πίνακα "dept".
- Γραμμή κωδικού 20-26: Εισαγωγή δεδομένων στον πίνακα «emp».
Παραγωγή
Η διαδικασία PL / SQL ολοκληρώθηκε
Βήμα 3) Δημιουργία προβολής για τον παραπάνω πίνακα.
CREATE VIEW guru99_emp_view(Employee_name:dept_name,location) ASSELECT emp.emp_name,dept.dept_name,dept.locationFROM emp,deptWHERE emp.dept_no=dept.dept_no;/
SELECT * FROM guru99_emp_view;
Επεξήγηση κώδικα
- Γραμμή κώδικα 27-32: Δημιουργία προβολής «guru99_emp_view».
- Γραμμή κωδικού 33: Ερώτηση γκουρού99_emp_view.
Παραγωγή
Η προβολή δημιουργήθηκε
ΟΝΟΜΑ ΥΠΑΛΛΗΛΟΥ | DEPT_NAME | ΤΟΠΟΘΕΣΙΑ |
ΖΖΖ | ΩΡ | ΗΠΑ |
Εεε | ΕΚΠΤΩΣΕΙΣ | Ηνωμένο Βασίλειο |
XXX | ΧΡΗΜΑΤΟΟΙΚΟΝΟΜΙΚΗ | ΙΑΠΩΝΙΑ |
Βήμα 4) Ενημέρωση προβολής πριν αντί για ενεργοποίηση.
BEGINUPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name=:'XXX’;COMMIT;END;/
Επεξήγηση κώδικα
- Γραμμή κωδικού 34-38: Ενημερώστε την τοποθεσία του "XXX" σε "ΓΑΛΛΙΑ". Έθεσε την εξαίρεση επειδή οι δηλώσεις DML δεν επιτρέπονται στην περίπλοκη προβολή.
Παραγωγή
ORA-01779: δεν είναι δυνατή η τροποποίηση μιας στήλης που αντιστοιχεί σε έναν πίνακα χωρίς συντήρηση κλειδιών
ORA-06512: στη γραμμή 2
Βήμα 5) Για να αποφύγετε την εμφάνιση σφάλματος κατά την ενημέρωση της προβολής στο προηγούμενο βήμα, σε αυτό το βήμα θα χρησιμοποιήσουμε το "αντί για ενεργοποίηση".
CREATE TRIGGER guru99_view_modify_trgINSTEAD OF UPDATEON guru99_emp_viewFOR EACH ROWBEGINUPDATE deptSET location=:new.locationWHERE dept_name=:old.dept_name;END;/
Επεξήγηση κώδικα
- Γραμμή κωδικού 39: Δημιουργία του INSTEAD OF trigger για το συμβάν «ΕΝΗΜΕΡΩΣΗ» στην προβολή «guru99_emp_view» στο επίπεδο ROW. Περιέχει τη δήλωση ενημέρωσης για την ενημέρωση της θέσης στο βασικό πίνακα "dept".
- Γραμμή κώδικα 44: Η δήλωση ενημέρωσης χρησιμοποιεί «: ΝΕΟ» και «: ΠΑΛΙΟ» για να βρει την τιμή των στηλών πριν και μετά την ενημέρωση.
Παραγωγή
Δημιουργήθηκε Trigger
Βήμα 6) Ενημέρωση προβολής μετά αντί για ενεργοποίηση. Τώρα το σφάλμα δεν θα έρθει καθώς το "αντί της σκανδάλης" θα χειριστεί τη λειτουργία ενημέρωσης αυτής της σύνθετης προβολής. Και όταν ο κώδικας έχει εκτελεστεί, η τοποθεσία του υπαλλήλου XXX θα ενημερωθεί σε "Γαλλία" από το "Ιαπωνία".
BEGINUPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name='XXX';COMMIT;END;/
SELECT * FROM guru99_emp_view;
Επεξήγηση κώδικα:
- Γραμμή κωδικού 49-53: Ενημέρωση της τοποθεσίας "XXX" σε "ΓΑΛΛΙΑ". Είναι επιτυχές, επειδή η σκανδάλη "INSTEAD OF" έχει σταματήσει την προβολή της πραγματικής ενημέρωσης στην προβολή και πραγματοποίησε την ενημέρωση του βασικού πίνακα.
- Γραμμή κωδικού 55: Επαλήθευση της ενημερωμένης εγγραφής.
Παραγωγή:
Η διαδικασία PL / SQL ολοκληρώθηκε με επιτυχία
ΟΝΟΜΑ ΥΠΑΛΛΗΛΟΥ | DEPT_NAME | ΤΟΠΟΘΕΣΙΑ |
ΖΖΖ | ΩΡ | ΗΠΑ |
Εεε | ΕΚΠΤΩΣΕΙΣ | Ηνωμένο Βασίλειο |
XXX | ΧΡΗΜΑΤΟΟΙΚΟΝΟΜΙΚΗ | ΓΑΛΛΙΑ |
Σύνθετη σκανδάλη
Η σύνθετη σκανδάλη είναι μια σκανδάλη που σας επιτρέπει να καθορίσετε ενέργειες για καθένα από τα τέσσερα σημεία χρονισμού στο σώμα μιας σκανδάλης. Τα τέσσερα διαφορετικά χρονικά σημεία που υποστηρίζει είναι όπως παρακάτω.
- ΠΡΙΝ ΤΗ ΔΗΛΩΣΗ - επίπεδο
- ΠΡΙΝ ΤΟ ΣΕΙΡΑ - επίπεδο
- ΜΕΤΑ ΤΟ ΣΕΙΡΑ - επίπεδο
- ΜΕΤΑ ΤΗ ΔΗΛΩΣΗ - επίπεδο
Παρέχει τη δυνατότητα συνδυασμού των ενεργειών για διαφορετικό χρονισμό στην ίδια σκανδάλη.
CREATE [ OR REPLACE ] TRIGGERFOR[INSERT | UPDATE | DELET… .]ON BEFORE STATEMENT ISBEGIN ;END BEFORE STATEMENT;BEFORE EACH ROW ISBEGIN ;END EACH ROW;AFTER EACH ROW ISBEGIN ;END AFTER EACH ROW;AFTER STATEMENT ISBEGIN ;END AFTER STATEMENT;END;
Επεξήγηση σύνταξης:
- Η παραπάνω σύνταξη δείχνει τη δημιουργία της ετικέτας «ΕΝΩΣΗ».
- Η ενδεικτική ενότητα είναι κοινή για όλο το μπλοκ εκτέλεσης στο σώμα της σκανδάλης.
- Αυτά τα 4 μπλοκ χρονισμού μπορούν να είναι σε οποιαδήποτε σειρά. Δεν είναι υποχρεωτικό να υπάρχουν και αυτά τα 4 μπλοκ χρονισμού. Μπορούμε να δημιουργήσουμε μια σκανδάλη ΕΝΩΣΗΣ μόνο για τους χρονισμούς που απαιτούνται.
Παράδειγμα 1 : Σε αυτό το παράδειγμα, πρόκειται να δημιουργήσουμε μια σκανδάλη για αυτόματη συμπλήρωση της στήλης μισθών με την προεπιλεγμένη τιμή 5000.
CREATE TRIGGER emp_trigFOR INSERTON empCOMPOUND TRIGGERBEFORE EACH ROW ISBEGIN:new.salary:=5000;END BEFORE EACH ROW;END emp_trig;/
BEGININSERT INTO EMP VALUES(1004,‘CCC’,15000,‘AAA’,30);COMMIT;END;/
SELECT * FROM emp WHERE emp_no=1004;
Επεξήγηση κώδικα:
- Γραμμή κώδικα 2-10 : Δημιουργία σύνθετης σκανδάλης. Έχει δημιουργηθεί για χρονισμό ΠΡΙΝ το επίπεδο ROW για να συμπληρώσει τον μισθό με την προεπιλεγμένη τιμή 5000. Αυτό θα αλλάξει τον μισθό στην προεπιλεγμένη τιμή «5000» πριν από την εισαγωγή της εγγραφής στον πίνακα.
- Γραμμή κωδικού 11-14 : Εισαγάγετε την εγγραφή στον πίνακα «emp».
- Γραμμή κώδικα 16 : Επαλήθευση της εγγραφείσας εγγραφής.
Παραγωγή:
Δημιουργήθηκε ετικέτα
Η διαδικασία PL / SQL ολοκληρώθηκε με επιτυχία.
EMP_NAME | EMP_NO | ΜΙΣΘΟΣ | ΔΙΕΥΘΥΝΤΗΣ | DEPT_NO |
CCC | 1004 | 5000 | ΑΑΑ | 30 |
Ενεργοποίηση και απενεργοποίηση σκανδάλων
Οι κανόνες ενεργοποίησης μπορούν να ενεργοποιηθούν ή να απενεργοποιηθούν. Για να ενεργοποιήσετε ή να απενεργοποιήσετε τη σκανδάλη, πρέπει να δοθεί μια δήλωση ALTER (DDL) για την σκανδάλη που την απενεργοποιεί ή την ενεργοποιεί.
Παρακάτω είναι η σύνταξη για την ενεργοποίηση / απενεργοποίηση των ενεργοποιήσεων.
ALTER TRIGGER[ENABLE|DISABLE];ALTER TABLE [ENABLE|DISABLE] ALL TRIGGERS;
Επεξήγηση σύνταξης:
- Η πρώτη σύνταξη δείχνει πώς να ενεργοποιήσετε / απενεργοποιήσετε τη μοναδική σκανδάλη.
- Η δεύτερη δήλωση δείχνει πώς να ενεργοποιήσετε / απενεργοποιήσετε όλους τους κανόνες ενεργοποίησης σε έναν συγκεκριμένο πίνακα.
Περίληψη
Σε αυτό το κεφάλαιο, μάθαμε για τους ενεργοποιητές PL / SQL και τα πλεονεκτήματά τους. Έχουμε επίσης μάθει τις διάφορες ταξινομήσεις και συζητήσαμε το INSTEAD OF trigger και το COMPOUND trigger.