Χρήση TRY / CATCH για αντιμετώπιση λαθών SQL Server

click fraud protection

Η δήλωση TRY / CATCH στο Transact-SQL εντοπίζει και χειρίζεται συνθήκες σφάλματος σε εφαρμογές βάσης δεδομένων. Αυτή η δήλωση είναι ο ακρογωνιαίος λίθος του SQL Χειρισμός σφαλμάτων διακομιστή και αποτελεί σημαντικό μέρος της ανάπτυξης ισχυρών εφαρμογών βάσης δεδομένων.

Το TRY / CATCH ισχύει για τον SQL Server ξεκινώντας από το 2008, Azure SQL Database, Azure SQL Data Warehouse και Parallel Data Warehouse.

Παρουσιάζουμε το TRY / CATCH

Το TRY./CATCH λειτουργεί καθορίζοντας δύο δηλώσεις Transact-SQL: μία που θέλετε να "δοκιμάσετε" και μια άλλη για να "πιάσετε" τυχόν σφάλματα που ενδέχεται να προκύψουν. Όταν ο SQL Server συναντά μια δήλωση TRY / CATCH, εκτελεί αμέσως τη δήλωση που περιλαμβάνεται στον όρο TRY. Εάν η δήλωση TRY εκτελείται με επιτυχία, ο SQL Server συνεχίζει. Ωστόσο, εάν η δήλωση TRY δημιουργεί σφάλμα, ο SQL Server εκτελεί τη δήλωση CATCH για να χειριστεί το σφάλμα με χαρά.

Η βασική σύνταξη παίρνει αυτήν τη μορφή:

ΑΡΧΙΚΗ ΔΟΚΙΜΗ
{sql_statement | μπλοκ δήλωσης}
ΤΕΛΟΣ ΔΟΚΙΜΗΣ
ΑΡΧΙΚΗ ΚΑΤΑΣΤΗΜΑ
[{sql_statement | statement_block}]
ΤΕΛΟΣ CATCH
[; ]
instagram viewer

Παράδειγμα TRY / CATCH

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

Μπορείτε να επιχειρήσετε να χρησιμοποιήσετε την παρακάτω δήλωση για να εισαγάγετε έναν νέο υπάλληλο στη βάση δεδομένων σας:

INSERT INTO υπαλλήλους (αναγνωριστικό, όνομα_συνόλου, επώνυμο, επέκταση)
ΤΙΜΕΣ (12497, "Mike", "Chapple", 4201)

Υπό κανονικές συνθήκες, αυτή η δήλωση θα προσθέσει μια σειρά στον πίνακα "Υπάλληλοι". Ωστόσο, εάν υπάρχει ήδη ένας υπάλληλος με αναγνωριστικό 12497 στη βάση δεδομένων, η εισαγωγή της σειράς θα παραβίαζε τον περιορισμό του πρωτεύοντος κλειδιού και θα είχε ως αποτέλεσμα το ακόλουθο σφάλμα:

Msg 2627, Επίπεδο 14, Κατάσταση 1, Γραμμή 1
Παραβίαση του βασικού περιορισμού «PK_employee_id». Δεν είναι δυνατή η εισαγωγή διπλού κλειδιού στο αντικείμενο "dbo.employees".
Η δήλωση έχει τερματιστεί.

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

Η εναλλακτική λύση είναι να τυλίξετε τη δήλωση σε μια δήλωση TRY… CATCH, όπως φαίνεται εδώ:

ΑΡΧΙΚΗ ΔΟΚΙΜΗ
INSERT INTO υπαλλήλους (αναγνωριστικό, όνομα_συνόλου, επώνυμο, επέκταση)
ΤΙΜΕΣ (12497, "Mike", "Chapple", 4201)
ΤΕΛΟΣ ΔΟΚΙΜΗΣ
ΑΡΧΙΚΗ ΚΑΤΑΣΤΗΜΑ
ΕΚΤΥΠΩΣΗ "ΣΦΑΛΜΑ:" + ΣΦΑΛΜΑ_ΜΕΣΑ ();
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'Υπάλληλος Mail',
@recipients = '[email protected]',
@body = "Παρουσιάστηκε σφάλμα κατά τη δημιουργία μιας νέας εγγραφής υπαλλήλου.",
@subject = 'Σφάλμα βάσης δεδομένων εργαζομένων';
ΤΕΛΟΣ CATCH

Σε αυτό το παράδειγμα, τυχόν σφάλματα που εμφανίζονται αναφέρονται τόσο στον χρήστη που εκτελεί την εντολή όσο και στη διεύθυνση ηλεκτρονικού ταχυδρομείου [email protected]. Το σφάλμα που εμφανίζεται στον χρήστη είναι:

Σφάλμα: Παραβίαση του βασικού περιορισμού «PK_employee_id». 
Δεν είναι δυνατή η εισαγωγή διπλού κλειδιού στο αντικείμενο "dbo.employees".
Η ουρά αναρτήθηκε.

Η εκτέλεση της εφαρμογής συνεχίζεται κανονικά, επιτρέποντας στον προγραμματιστή να χειριστεί το σφάλμα. Η χρήση της δήλωσης TRY / CATCH είναι ένας κομψός τρόπος για τον προληπτικό εντοπισμό και τον χειρισμό σφαλμάτων που εμφανίζονται σε εφαρμογές βάσης δεδομένων SQL Server.

Μάθετε περισσότερα

Για να μάθετε περισσότερα σχετικά με τη Δομημένη γλώσσα ερωτημάτων, ανατρέξτε στο άρθρο μας Βασικές αρχές της SQL.

instagram story viewer