SQL Triggers: The Essential Guide

Τα triggers είναι οντότητες βάσης δεδομένων στον SQL Server. Τεχνικά, είναι μια συγκεκριμένη κατηγορία κλήσεων συναρτήσεων που ανταποκρίνεται σε συγκεκριμένες λειτουργίες βάσης δεδομένων.

Αυτός ο ουσιαστικός οδηγός θα σας δώσει σε βάθος πληροφορίες σχετικά με τα SQL Triggers που μπορεί να είναι αρκετά χρήσιμα στο επάγγελμά σας. Ας αρχίσουμε!

Τι είναι τα SQL Triggers;

Η λέξη “trigger” περιγράφει μια δήλωση ότι ένας διακομιστής εκτελεί αυτόματα το ερώτημα κάθε φορά που το περιεχόμενο στη βάση δεδομένων αλλάζει.

Ένα έναυσμα είναι μια ομάδα ερωτημάτων SQL με ειδική ονομασία που αποθηκεύονται στο χώρο της μνήμης. Είναι ένας συγκεκριμένος τύπος κλήσης συνάρτησης που καλείται αμέσως κάθε φορά που λαμβάνει χώρα κάποιο συμβάν βάσης δεδομένων. Σε κάθε έναυσμα έχει εκχωρηθεί ένας πίνακας.

Για παράδειγμα, ένας κανόνας ετικέτας θα μπορούσε να ενεργοποιηθεί κάθε φορά που προστίθεται μια νέα στήλη σε έναν συγκεκριμένο πίνακα ή εάν τροποποιούνται συγκεκριμένες εγγραφές.

Σύμφωνα με το Microsoft Developer Network, οι κανόνες ετικέτας είναι μια συγκεκριμένη κατηγορία αποθηκευμένων διαδικασιών. Σε μια δήλωση ενεργοποίησης, αρχικά ορίζουμε πότε πρέπει να εκτελεστεί η ενεργοποίηση και, στη συνέχεια, παρέχουμε την ενέργεια που πρέπει να γίνει μετά την ενεργοποίηση της ενεργοποίησης.

Σύνταξη:

CREATE TRIGGER trigger_name
BEFORE/AFTER
INSERT/UPDATE/DELETE
ON tableName
FOR EACH ROW SET operation [trigger_body];

Επεξήγηση κάθε παραμέτρου

  • CREATE TRIGGER trigger_name – Χρησιμοποιείται για τη δημιουργία ενός κανόνα ετικέτας ή για την αλλαγή του ονόματος ενός υπάρχοντος κανόνα ετικέτας.
  • BEFORE/AFTER – Αυτό το ερώτημα χρησιμοποιείται για τον καθορισμό του χρόνου εκτέλεσης του κανόνα (πριν ή μετά από ένα συγκεκριμένο συμβάν).
  • ΕΙΣΑΓΩΓΗ/ΕΝΗΜΕΡΩΣΗ/ΔΙΑΓΡΑΦΗ – Αυτό περιγράφει την ενέργεια που θέλουμε να κάνουμε στους πίνακες.
  • ON tableName – Εδώ, ορίζουμε το όνομα του πίνακα για να ρυθμίσετε έναν κανόνα.
  • ΓΙΑ ΚΑΘΕ ΣΕΙΡΑ – Αυτή η δήλωση σχετίζεται με την ενεργοποίηση σειράς, που σημαίνει ότι οι κανόνες ετικέτας θα εκτελούνται κάθε φορά που μια σειρά τροποποιείται.
  • trigger_body – Καθορίζει την ενέργεια που πρέπει να γίνει όταν ενεργοποιηθεί η σκανδάλη.

Τα triggers είναι αποθηκευμένες συναρτήσεις με διακριτικές ταυτότητες που μας επιτρέπουν να επαναχρησιμοποιούμε ερωτήματα που έχουν ήδη εκτελεστεί και αποθηκευτεί με ασφάλεια στη μνήμη. Τώρα ας προσπαθήσουμε να καταλάβουμε γιατί τα χρειάζεται η SQL.

Οι ενεργοποιητές χρησιμοποιούνται κυρίως για τη ρύθμιση της ανάπτυξης του κώδικα κάθε φορά που λαμβάνει χώρα ένα συμβάν. Για να το θέσουμε διαφορετικά, η χρήση καναλιών είναι η ιδανική επιλογή εάν χρειάζεστε ένα συγκεκριμένο τμήμα κώδικα να εκτελείται συνεχώς ως απόκριση σε ένα καθορισμένο συμβάν.

Ακολουθούν ορισμένα πλεονεκτήματα από τη χρήση κανόνων σε λειτουργίες βάσης δεδομένων SQL.

  • Εκτελεί πρόσθετους ελέγχους κατά την εισαγωγή, ενημέρωση ή διαγραφή δεδομένων από τον επηρεαζόμενο πίνακα.
  • Μειώνει τους χρόνους απόκρισης, γεγονός που βοηθά στην αύξηση των υπολογιστικών εξόδων.
  • Επιτρέπει την κωδικοποίηση εξελιγμένων προεπιλεγμένων παραμέτρων που δεν είναι προσβάσιμες από αρχικούς περιορισμούς.
  •   8 καλύτερα εργαλεία παρακολούθησης εικονικοποίησης για μεσαίες έως μεγάλες επιχειρήσεις

    Η ακεραιότητα αναφοράς είναι μια βασική βασική ιδιότητα των συστημάτων σχεσιακών βάσεων δεδομένων. Αυτό σημαίνει ότι τα δεδομένα που διατηρούνται στο σύστημα βάσης δεδομένων πρέπει να είναι πάντα ακριβή για κάθε συναλλαγή και κάθε λειτουργία.

    Εάν δύο πίνακες βρίσκονται σε ξεχωριστές βάσεις δεδομένων ή συστήματα, δεν υπάρχει τρόπος να διασφαλιστεί η επικύρωση δεδομένων μέσα σε αυτούς χρησιμοποιώντας τιμές περιορισμού. Σε μια τέτοια κατάσταση, οι σκανδαλισμοί είναι η μόνη επιλογή για εκτέλεση.

    Συνδυασμός επιχειρημάτων σκανδάλης

    Για κάθε πίνακα, μπορούμε να καθορίσουμε έξι διαφορετικούς τύπους ενεργοποίησης. Αυτά είναι ο συνδυασμός ορισμάτων Trigger που περιλαμβάνονται στα Triggers σε επίπεδο σειράς SQL.

    ΠΡΙΝ ΕΙΣΑΓΩΓΗ: Αυτοί οι κανόνες ετικέτας εκτελούν την ενέργεια στις σειρές πριν από την εκτέλεση οποιωνδήποτε λειτουργιών INSERT στον καθορισμένο πίνακα ή στη βάση δεδομένων.

    AFTER INSERT: Εκτελεί την ενέργεια σε σειρές αμέσως μετά από οποιαδήποτε δραστηριότητα INSERT βάσης δεδομένων.

    ΠΡΙΝ ΤΗΝ ΕΝΗΜΕΡΩΣΗ: Με αυτούς τους κανόνες ετικέτας, μια συνάρτηση στις σειρές εκτελείται πριν από την εκτέλεση μιας ενέργειας ΕΝΗΜΕΡΩΣΗΣ στη βάση δεδομένων.

    ΜΕΤΑ ΤΗΝ ΕΝΗΜΕΡΩΣΗ: Εκτελεί την ενέργεια σε σειρές αμέσως μετά από οποιαδήποτε δραστηριότητα ΕΝΗΜΕΡΩΣΗΣ βάσης δεδομένων ή συγκεκριμένου πίνακα.

    ΠΡΙΝ ΔΙΑΓΡΑΦΗ: Εκτελεί μια συγκεκριμένη λειτουργία σε σειρές ακόμη και πριν η βάση δεδομένων ή ο πίνακας υποβληθεί σε ενέργεια ΔΙΑΓΡΑΦΗ.

    ΜΕΤΑ ΤΗ ΔΙΑΓΡΑΦΗ: Αυτοί οι κανόνες ετικέτας εκτελούν την ενέργεια στις σειρές που ακολουθούν κάθε συναλλαγή DELETE.

    Τύποι ενεργοποιητών SQL

    Οι ενεργοποιήσεις SQL είναι αποθηκευμένες συναρτήσεις που εκτελούνται αμέσως όταν συμβαίνουν συγκεκριμένα συμβάντα. Μοιάζει με προγραμματισμό που βασίζεται σε εκδηλώσεις. Οι επόμενες καταστάσεις μπορούν να ξεκινήσουν την εκτέλεση σκανδαλισμών.

    DML Triggers – Το DML σημαίνει Γλώσσα χειρισμού δεδομένων. Η εκτέλεση κώδικα ως αντίδραση στην τροποποίηση δεδομένων είναι δυνατή με τη χρήση ενεργοποιητών DML. Αυτό το έναυσμα ενεργοποιείται όταν εκτελούνται εντολές DML όπως INSERT, UPDATE και DELETE. Αυτά ονομάζονται επίσης «Ενεργοποιητές επιπέδου πίνακα».

    DDL Triggers – Το DDL σημαίνει γλώσσα ορισμού δεδομένων. Τα DDL Triggers μας δίνουν τη δυνατότητα να εκτελούμε κώδικα ως αντίδραση σε αλλαγές σχήματος βάσης δεδομένων, όπως προσθήκη ή διαγραφή πινάκων ή συμβάντων διακομιστή, όπως όταν ένας χρήστης κάνει check in. Αυτά ονομάζονται “Ενεργοποιήσεις επιπέδου βάσης δεδομένων”.

    Αυτοί οι Ενεργοποιητές μπορούν να ενεργοποιηθούν, όταν ορισμένες δηλώσεις DDL όπως CREATE, ALTER ή DROP εκτελούνται στην ενεργή βάση δεδομένων. Αυτά μπορούν επίσης να χρησιμοποιηθούν για την παρακολούθηση και τη διαχείριση των δραστηριοτήτων που εκτελούνται.

    Ενεργοποιήσεις LOGON – Κάθε φορά που συμβαίνει κάποιο συμβάν LOGON (Εκκίνηση, σύνδεση, Αποσύνδεση, τερματισμός λειτουργίας), οι Ενεργοποιητές σύνδεσης καλούνται αμέσως. Εκτελούνται μόνο μετά από διαδικασία ελέγχου ταυτότητας χρήστη, ακόμη και πριν από την έναρξη της συναλλαγής χρήστη. Οι ενεργοποιητές LOGON δεν θα ενεργοποιηθούν εάν αποτύχει η εξουσιοδότηση.

    Αυτοί οι κανόνες ετικέτας μπορούν να χρησιμοποιηθούν για την καταγραφή του ιστορικού σύνδεσης ή τον καθορισμό ενός περιορισμού συμβάντων για μια συγκεκριμένη σύνδεση, μεταξύ άλλων λειτουργιών ελέγχου και διαχείρισης ταυτότητας για συνδέσεις διακομιστή.

    CLR Triggers – CLR σημαίνει Common Language Runtime. Οι εναύσματα CLR είναι πράγματι ένα μοναδικό υποσύνολο ενεργοποιητών που έχουν δημιουργηθεί κυρίως σε CLR εντός της τεχνολογίας .NET. Αυτοί οι κανόνες ετικέτας είναι χρήσιμοι εάν ο κανόνας ετικέτας χρειάζεται να εκτελέσει πολλούς υπολογισμούς ή χρειάζεται να σχετίζεται με μια οντότητα διαφορετική από την SQL.

      Διορθώστε το αίτημα που απέτυχε λόγω ανεπανόρθωτου σφάλματος υλικού συσκευής

    Οι εκκινητές DML και DDL μπορούν πράγματι να κατασκευαστούν ενεργοποιώντας την κωδικοποίηση υποστηριζόμενων κανόνων CLR σε τεχνολογίες .NET, συμπεριλαμβανομένων των Visual Basic, C# και F-sharp.

    Δείγμα ενεργοποίησης διακομιστή SQL

    Ας κατανοήσουμε αυτές τις έννοιες ενεργοποίησης με ένα παράδειγμα.

    Αρχικά, ας δημιουργήσουμε μια βάση δεδομένων χρησιμοποιώντας δηλώσεις SQL.

    CREATE DATABASE testdb;
    use testdb;

    Εδώ, έχω δώσει ένα “testdb” ως όνομα της βάσης δεδομένων. Και το επόμενο βήμα είναι να δημιουργήσετε έναν πίνακα.

    CREATE TABLE student(
      name varchar(25),
      id int(2),
      maths int(2),
      physics int(2),
      biology int(2),
      social int(2),
      total int(2)
     );

    Έχω δημιουργήσει έναν πίνακα για την αποθήκευση των στοιχείων του μαθητή. Και εδώ είναι η εντολή για την περιγραφή της δομής του πίνακα. Εδώ “μαθητής” είναι το όνομα του πίνακα που έδωσα.

    DESC student;

    Παρακάτω είναι η δομή του πίνακα που έχω δημιουργήσει.

    +---------+-------------+------+-----+---------+-------+
    | Field   | Type        | Null | Key | Default | Extra |
    +---------+-------------+------+-----+---------+-------+
    | name    | varchar(25) | YES  |     | NULL    |       |
    | id      | int         | YES  |     | NULL    |       |
    | maths   | int         | YES  |     | NULL    |       |
    | physics | int         | YES  |     | NULL    |       |
    | biology | int         | YES  |     | NULL    |       |
    | social  | int         | YES  |     | NULL    |       |
    | total   | int         | YES  |     | NULL    |       |
    +---------+-------------+------+-----+---------+-------+
    7 rows in set (0.00 sec)

    Μετά τη δημιουργία ενός πίνακα, το επόμενο βήμα είναι να ρυθμίσετε έναν κανόνα. Ας δοκιμάσουμε να χρησιμοποιήσουμε το όρισμα ΠΡΙΝ ΕΙΣΑΓΩΓΗ.

    Το όνομα της σκανδάλης που δημιούργησα είναι “σημάδια”. Μόλις τροποποιηθεί ο πίνακας με τους βαθμούς του μαθητή, το έναυσμα παρακάτω προσπαθεί να καθορίσει αυτόματα τη συνολική βαθμολογία του μαθητή.

    CREATE TRIGGER marks
    BEFORE INSERT
    ON
    student
    FOR EACH ROW
    set new.total=new.maths+new.physics+new.biology+new.social;

    Δεδομένου ότι απαιτείται να αντικαταστήσουμε τα δεδομένα σειρών αντί να εργαζόμαστε με τα παλιά, ορίσαμε το “total” χρησιμοποιώντας ένα νέο όνομα κλάσης και όλες οι επόμενες εκφράσεις έχουν το πρόθεμα με νέες λέξεις-κλειδιά μετά το σύνολο χρησιμοποιώντας τον τελεστή κουκκίδας. Τώρα, θα προσθέσουμε τιμές σε κάθε σειρά και θα δούμε τα αποτελέσματα. Αρχικά, η συνολική βαθμολογία είναι 0 για κάθε μαθητή.

    INSERT INTO student VALUES("George",02,99,87,92,91,0);
    INSERT INTO student VALUES("James",03,91,81,94,90,0);
    INSERT INTO student VALUES("Harry",04,86,70,73,88,0);
    INSERT INTO student VALUES("John",05,73,89,78,92,0);
    INSERT INTO student VALUES("Lisa",01,94,75,69,79,0);
    

    Η δήλωση ενεργοποίησης θα ενεργοποιηθεί αυτόματα όταν εισάγονται δεδομένα στον πίνακα μαθητή σε αυτήν την περίπτωση. Οι συνολικές βαθμολογίες κάθε μαθητή θα υπολογίζονται από τη σκανδάλη. Τώρα, ας δούμε αν ο κανόνας ενεργοποιείται ή όχι χρησιμοποιώντας μια πρόταση SELECT.

    SELECT * FROM table_name;

    Και εδώ είναι το τελικό αποτέλεσμα.

    mysql> select * from student;
    +--------+------+-------+---------+---------+--------+-------+
    | name   | id   | maths | physics | biology | social | total |
    +--------+------+-------+---------+---------+--------+-------+
    | George |    2 |    91 |      81 |      94 |     90 |   356 |
    | James  |    3 |    86 |      70 |      73 |     88 |   317 |
    | Harry  |    4 |    73 |      89 |      78 |     92 |   332 |
    | John   |    5 |    94 |      75 |      69 |     79 |   317 |
    | Lisa   |    1 |    99 |      87 |      92 |     91 |   369 |
    +--------+------+-------+---------+---------+--------+-------+
    5 rows in set (0.00 sec)

    Στο παραπάνω αποτέλεσμα, μπορείτε να δείτε ότι όλοι οι βαθμοί θεμάτων προστίθενται αυτόματα για κάθε μαθητή. Επομένως, μπορούμε να συμπεράνουμε ότι η ενεργοποίηση ενεργοποιήθηκε με επιτυχία.

    Πρόσθετες λειτουργίες ενεργοποίησης

    Μπορούμε να εκτελέσουμε πολλές λειτουργίες χρησιμοποιώντας σκανδάλες. Μερικά μπορεί να είναι απλά και μερικά μπορεί να είναι λίγο περίπλοκα, αλλά μόλις εξετάσουμε τα ερωτήματα είναι εύκολο να τα καταλάβουμε. Χρησιμοποιώντας προτάσεις Transact-SQL, μπορείτε να ενεργοποιήσετε, να απενεργοποιήσετε ή να διαγράψετε τους κανόνες ετικέτας χρησιμοποιώντας τις ακόλουθες εντολές.

    Ερώτημα για να ελέγξετε εάν υπάρχει ή όχι ένας συγκεκριμένος κανόνας

    Αυτή η εντολή ελέγχει για το καθορισμένο έναυσμα σε ολόκληρη τη βάση δεδομένων.

    SELECT * FROM [sys].[triggers] WHERE [name] = 'Trigger_name'

    Ερώτημα για την εμφάνιση κανόνων

    Όλοι οι κανόνες ενεργοποίησης που είναι διαθέσιμοι στην ενεργή βάση δεδομένων θα εμφανίζονται με την ακόλουθη δήλωση.

    SHOW TRIGGERS;

    Ερώτημα για απενεργοποίηση ενεργοποίησης

    Η παρακάτω εντολή απενεργοποιεί τη σκανδάλη στη βάση δεδομένων εργασίας.

    DISABLE TRIGGER trigger_name ON DATABASE;

    Μπορείτε επίσης να καθορίσετε ένα συγκεκριμένο όνομα πίνακα για να απενεργοποιήσετε έναν κανόνα.

    DISABLE TRIGGER trigger_name ON table_name;

    Ερώτημα για ενεργοποίηση ενεργοποίησης

    Η ακόλουθη εντολή απενεργοποιεί πρώτα έναν συγκεκριμένο κανόνα ετικέτας που ορίστηκε στον καθορισμένο πίνακα στην ενεργή βάση δεδομένων πριν τον ενεργοποιήσει ξανά.

    ALTER TABLE table_name DISABLE TRIGGER trigger_name
    
    ALTER TABLE table_name ENABLE TRIGGER trigger_name

    Η σκανδάλη πρέπει να είναι απενεργοποιημένη, πριν προσπαθήσετε να την ενεργοποιήσετε,

      Πώς να επαναφέρετε το Apple Watch χρησιμοποιώντας το iPhone σας

    Ερώτημα για ενεργοποίηση ή απενεργοποίηση όλων των κανόνων σε έναν πίνακα

    Χρησιμοποιώντας την παραπάνω πρόταση SQL, μπορούμε να απενεργοποιήσουμε ή να ενεργοποιήσουμε όλους τους κανόνες ετικέτας κάθε φορά αντικαθιστώντας το “ALL” στη θέση ενός συγκεκριμένου ονόματος ενεργοποίησης.

    ALTER TABLE table_name DISABLE TRIGGER ALL 
    
    ALTER TABLE table_name ENABLE TRIGGER ALL

    Ερώτημα για διαγραφή ή απόρριψη του κανόνα ετικέτας

    Μια σκανδάλη μπορεί να εξαλειφθεί διαγράφοντας την ή ολόκληρο τον πίνακα. Κάθε σχετικός κανόνας ετικέτας διαγράφεται επίσης όταν διαγράφεται ένας πίνακας.

    DROP TRIGGER [trigger_name];

    Κάθε φορά που διαγράφεται ένας κανόνας ετικέτας, τα σχετικά δεδομένα διαγράφονται από τον πίνακα δεδομένων sys.objects.

    Πλεονεκτήματα των Triggers

    • Είναι απλό να δημιουργήσετε έναυσμα και το ίδιο το έναυσμα μπορεί να καλέσει αποθηκευμένες λειτουργίες και μεθόδους.
    • Οι χρήστες μπορούν να εφαρμόσουν απλό έλεγχο χρησιμοποιώντας εναύσματα.
    • Δυστυχώς, δεν μπορείτε να δημιουργήσετε περιορισμούς σε οντότητες σε συστήματα βάσεων δεδομένων με τον SQL Server, αν και μπορείτε να μιμηθείτε τη λειτουργία των περιορισμών χρησιμοποιώντας εναύσματα.
    • Οι περιορισμοί ακεραιότητας μπορούν να εφαρμοστούν σε βάσεις δεδομένων χρησιμοποιώντας εναύσματα.
    • Όταν απαιτείται επικύρωση ομάδας αντί για επαλήθευση σειράς προς σειρά δεδομένων που εισήχθησαν πρόσφατα ή άλλαξαν, οι κανόνες ετικέτας μπορεί να είναι χρήσιμοι.

    Μειονεκτήματα των Triggers

    Τα SQL Triggers ενδέχεται να μην είναι η καλύτερη επιλογή σε ορισμένες περιπτώσεις λόγω των περιορισμών τους.

    • Οι ενεργοποιητές πρέπει να τεκμηριώνονται με ακρίβεια.
    • Λόγω της ταυτόχρονης εκτέλεσης της βάσης δεδομένων που ενδέχεται να μην είναι προσβάσιμη στα στοιχεία της εφαρμογής, οι ενεργοποιητές μπορεί να είναι δύσκολο να εντοπιστούν σφάλματα.
    • Οι δηλώσεις DML γίνονται πιο περίπλοκες όταν χρησιμοποιούνται κανόνες ενεργοποίησης.
    • Ακόμη και ένα μικρό πρόβλημα ενεργοποίησης έχει τη δυνατότητα να οδηγήσει σε λογικά σφάλματα στη δήλωση.

    συμπέρασμα

    Τα triggers είναι πολύ χρήσιμα στοιχεία του Transact-SQL και SQL και μπορείτε να τα χρησιμοποιήσετε και στο Oracle. Η χρήση κανόνων είναι ζωτικής σημασίας κατά την κλήση αποθηκευμένων μεθόδων. Αυτά τα SQL Triggers μας επιτρέπουν να αναλύσουμε τα χρονοδιαγράμματα της δραστηριότητας και να προσδιορίσουμε πώς να ανταποκριθούμε σε αυτά εάν είναι απαραίτητο. Μπορούμε επίσης να ελέγξουμε για έναν συγκεκριμένο πίνακα που είναι συνδεδεμένος με έναν κανόνα για τη λήψη δεδομένων.

    Η αναδρομή μπορεί να ενεργοποιηθεί από εναύσματα. Κάθε φορά που ένας κανόνας ετικέτας σε έναν πίνακα εκτελεί μια εντολή στον γονικό πίνακα, η δεύτερη επανάληψη του έναυσμα ενεργοποιείται και αυτό είναι γνωστό ως αναδρομικός κανόνας. Αυτό βοηθά στην προσπάθεια επίλυσης μιας συσχέτισης ταυτότητας.

    Επιπλέον, οι ενεργοποιήσεις ρυθμίζουν το μοτίβο ενημέρωσης που επιτρέπεται να δέχεται η βάση δεδομένων. Είναι πολύ ωφέλιμο να διατηρούνται οι περιορισμοί ακεραιότητας δεδομένων στο σύστημα βάσης δεδομένων εάν τα κλειδιά περιορισμού SQL δεν υπάρχουν κυρίως το πρωτεύον κλειδί και το ξένο κλειδί.

    Ελπίζω να βρήκατε αυτό το άρθρο χρήσιμο για την εκμάθηση των SQL Triggers.

    Εάν θέλετε να μάθετε βάσεις δεδομένων σε βάθος, εδώ είναι μερικοί εξαιρετικοί πόροι για να μάθετε SQL και NoSQL.