T-SQL त्रुटि प्रबंधन लागू करें
कोई त्रुटि डेटाबेस कार्रवाई के दौरान उत्पन्न होने वाली समस्या या उल्लेखनीय समस्या को इंगित करती है. त्रुटियाँ SQL Server डेटाबेस इंजिन द्वारा किसी इवेंट या सिस्टम स्तर पर विफलता के प्रत्युत्तर में उत्पन्न किया जा सकता है; या आप अपने Transact-SQL कोड में एप्लिकेशन त्रुटियां उत्पन्न कर सकते हैं।
डेटाबेस इंजन त्रुटियों के तत्व
कारण जो भी हो, प्रत्येक त्रुटि निम्नलिखित तत्वों से बनी होती है:
- त्रुटि संख्या - विशिष्ट त्रुटि की पहचान करने वाली अद्वितीय संख्या।
- त्रुटि संदेश - त्रुटि का वर्णन करने वाला पाठ।
- गंभीरता - 1 से 25 तक गंभीरता का संख्यात्मक संकेत।
- राज्य - डेटाबेस इंजन स्थिति के लिए आंतरिक राज्य कोड।
- प्रक्रिया - संग्रहीत कार्यविधि या ट्रिगर का नाम जिसमें त्रुटि हुई।
- लाइन नंबर - बैच या प्रक्रिया में किस कथन ने त्रुटि उत्पन्न की।
सिस्टम त्रुटियाँ
सिस्टम त्रुटियाँ पूर्वनिर्धारित होती हैं, और आप उन्हें sys.messages सिस्टम दृश्य में देख सकते हैं. जब कोई सिस्टम त्रुटि उत्पन्न होती है, तो SQL सर्वर त्रुटि की गंभीरता के आधार पर स्वत: उपचारात्मक क्रिया ले सकता है। उच्च-गंभीरता त्रुटि उत्पन्न होती है, जब उदाहरण के लिए, SQL सर्वर किसी डेटाबेस ऑफ़लाइन ले सकता है या डेटाबेस इंजिन सेवा को रोक भी सकता है।
कस्टम त्रुटियां
आप अनुप्रयोग-विशिष्ट स्थितियों का प्रतिसाद देने के लिए या सिस्टम त्रुटियों के प्रत्युत्तर में क्लाइंट अनुप्रयोगों को भेजी गई जानकारी को अनुकूलित करने के लिए कोड Transact-SQL में त्रुटियाँ जनरेट कर सकते हैं. इन अनुप्रयोग त्रुटियों को इनलाइन परिभाषित किया जा सकता है जहाँ वे उत्पन्न होते हैं, या आप उन्हें सिस्टम-आपूर्ति की गई त्रुटियों के साथ sys.messages तालिका में पूर्वनिर्धारित कर सकते हैं। कस्टम त्रुटियों के लिए उपयोग की गई त्रुटि संख्याएँ 50001 या उससे अधिक होनी चाहिए.
sys.messages में कस्टम त्रुटि संदेश जोड़ने के लिए, sp_addmessage का उपयोग करें. संदेश के लिए उपयोगकर्ता sysadmin या serveradmin निश्चित सर्वर भूमिकाओं का सदस्य होना आवश्यक है.
यह sp_addmessage सिंटैक्स है:
sp_addmessage [ @msgnum= ] msg_id , [ @severity= ] severity , [ @msgtext= ] 'msg'
[ , [ @lang= ] 'language' ]
[ , [ @with_log= ] { 'TRUE' | 'FALSE' } ]
[ , [ @replace= ] 'replace' ]
इस सिंटैक्स का उपयोग करके कस्टम त्रुटि संदेश का एक उदाहरण यहां दिया गया है:
sp_addmessage 50001, 10, N’Unexpected value entered’;
इसके अतिरिक्त, आप कस्टम त्रुटि संदेश निर्धारित कर सकते हैं, sysadmin सर्वर भूमिका के सदस्य अतिरिक्त पैरामीटर का भी उपयोग कर सकते @with_log. TRUE पर सेट होने पर, त्रुटि Windows अनुप्रयोग लॉग में भी रिकॉर्ड की जाएगी. Windows अनुप्रयोग लॉग करने के लिए लिखा गया कोई भी संदेश SQL सर्वर त्रुटि लॉग करने के लिए भी लिखा जाता है। विकल्प के उपयोग के @with_log साथ विवेकपूर्ण रहें क्योंकि नेटवर्क और सिस्टम प्रशासक उन अनुप्रयोगों को नापसंद करते हैं जो सिस्टम लॉग में "बातूनी" हैं। त्रुटि को किसी चेतावनी द्वारा ट्रैप करने की आवश्यकता है, तो हालाँकि, त्रुटि को पहले Windows अनुप्रयोग लॉग में लिखा जाना चाहिए।
नोट
सिस्टम त्रुटियों को उठाना समर्थित नहीं है।
संदेशों को पहले = 'बदलें' विकल्प का उपयोग करके @replace उन्हें हटाए बिना बदला जा सकता है।
संदेश अनुकूलन योग्य हैं और language_id मान के आधार पर कई भाषाओं के लिए एक ही त्रुटि संख्या के लिए अलग-अलग जोड़े जा सकते हैं।
नोट
अंग्रेजी संदेश 1033 language_id हैं।
RAISERROR का उपयोग करके त्रुटियाँ उठाएँ
PRINT और RAISERROR दोनों का उपयोग अनुप्रयोगों को जानकारी या चेतावनी संदेश वापस करने के लिए किया जा सकता है। RAISERROR अनुप्रयोगों को एक त्रुटि उठाने की अनुमति देता है जिसे तब कॉलिंग प्रक्रिया द्वारा पकड़ा जा सकता है।
ज्ञात त्रुटि कथन
T-SQL में त्रुटियों को बढ़ाने की क्षमता एप्लिकेशन में त्रुटि प्रबंधन को आसान बनाती है, क्योंकि यह किसी अन्य सिस्टम त्रुटि की तरह भेजा जाता है। RAISERROR का उपयोग निम्न के लिए किया जाता है:
- T-SQL कोड की समस्या निवारण में सहायता करें।
- डेटा के मानों की जाँच करें।
- चर पाठ वाले संदेश लौटाएँ.
नोट
PRINT कथन का उपयोग करना गंभीरता 10 की त्रुटि को बढ़ाने के समान है।
यहाँ RAISERROR का उपयोग कर एक कस्टम त्रुटि संदेश का एक उदाहरण है।
RAISERROR (N'%s %d', -- Message text,
10, -- Severity,
1, -- State,
N'Custom error message number',
2)
ट्रिगर होने पर, यह लौटाता है:
Custom error message number 2
पिछले उदाहरण में, %d किसी संख्या के लिए प्लेसहोल्डर है और %s स्ट्रिंग के लिए प्लेसहोल्डर है. इसके अलावा, आपको ध्यान देना चाहिए कि एक संदेश संख्या का उल्लेख नहीं किया गया था। जब इस सिंटैक्स का उपयोग करके संदेश स्ट्रिंग्स के साथ त्रुटियाँ उठाई जाती हैं, तो उनके पास हमेशा त्रुटि संख्या 50000 होती है.
THROW का उपयोग करके त्रुटियां बढ़ाएँ
थ्रो स्टेटमेंट कोड में त्रुटियों को बढ़ाने का एक सरल तरीका प्रदान करता है। त्रुटियों की त्रुटि संख्या कम से कम 50000 होनी चाहिए.
फेंक
THROW कई मायनों में RAISERROR से भिन्न है:
- थ्रो द्वारा उठाई गई त्रुटियां हमेशा गंभीरता 16 होती हैं।
- THROW द्वारा लौटाए गए संदेश sys.sysmessages में किसी भी प्रविष्टि से संबंधित नहीं हैं।
- THROW द्वारा उठाई गई त्रुटियाँ केवल SET XACT_ABORT ON के संयोजन में उपयोग किए जाने पर लेनदेन निरस्त करती हैं और सत्र समाप्त हो जाता है।
THROW 50001, 'An Error Occured',0
@@Error का उपयोग करके त्रुटि कोड कैप्चर करें
SQL सर्वर अनुप्रयोगों में सबसे पारंपरिक त्रुटि हैंडलिंग कोड @@ERROR का उपयोग करके बनाया गया है। संरचित अपवाद हैंडलिंग SQL Server 2005 में प्रस्तुत किया गया था और @@ERROR का उपयोग करने के लिए एक मजबूत विकल्प प्रदान करता है। इस पर अगले पाठ में चर्चा की जाएगी। मौजूदा SQL सर्वर त्रुटि हैंडलिंग कोड की एक बड़ी मात्रा @@ERROR पर आधारित है, इसलिए यह समझना महत्वपूर्ण है कि इसके साथ कैसे काम करना है।
@@ERROR
@@ERROR एक सिस्टम चर है जो पिछली त्रुटि की त्रुटि संख्या रखता है। @@ERROR के साथ एक महत्वपूर्ण चुनौती यह है कि यह जो मूल्य रखता है वह जल्दी से रीसेट हो जाता है क्योंकि प्रत्येक अतिरिक्त कथन निष्पादित होता है।
उदाहरण के लिए, निम्न कोड पर विचार करें:
RAISERROR(N'Message', 16, 1);
IF @@ERROR <> 0
PRINT 'Error=' + CAST(@@ERROR AS VARCHAR(8));
GO
आप उम्मीद कर सकते हैं कि, जब कोड निष्पादित किया जाता है, तो यह मुद्रित स्ट्रिंग में त्रुटि संख्या लौटाएगा। हालाँकि, जब कोड निष्पादित किया जाता है, तो यह लौटाता है:
Msg 50000, Level 16, State 1, Line 1
Message
Error=0
त्रुटि उठाई गई थी लेकिन मुद्रित संदेश "त्रुटि = 0" था। आउटपुट की पहली पंक्ति में, आप देख सकते हैं कि त्रुटि, जैसा कि अपेक्षित था, वास्तव में 50000 थी, जिसमें RAISERROR को एक संदेश दिया गया था। ऐसा इसलिए है क्योंकि RAISERROR कथन का अनुसरण करने वाला IF कथन सफलतापूर्वक निष्पादित किया गया था और @@ERROR मान को रीसेट करने का कारण बना। इस कारण से, @@ERROR के साथ काम करते समय, त्रुटि संख्या को एक चर में कैप्चर करना महत्वपूर्ण है जैसे ही इसे उठाया जाता है, और फिर चर के साथ प्रसंस्करण जारी रखें।
निम्न कोड को देखें जो यह प्रदर्शित करता है:
DECLARE @ErrorValue int;
RAISERROR(N'Message', 16, 1);
SET @ErrorValue = @@ERROR;
IF @ErrorValue <> 0
PRINT 'Error=' + CAST(@ErrorValue AS VARCHAR(8));
जब यह कोड निष्पादित होता है, तो यह निम्न आउटपुट देता है:
Msg 50000, Level 16, State 1, Line 2
Message
Error=50000
त्रुटि संख्या अब सही रूप से रिपोर्ट की गई है।
त्रुटि हैंडलिंग को केंद्रीकृत करना
त्रुटि हैंडलिंग के लिए @@ERROR का उपयोग करने के साथ एक अन्य महत्वपूर्ण मुद्दा यह है कि आपके T-SQL कोड के भीतर केंद्रीकृत करना मुश्किल है। त्रुटि हैंडलिंग पूरे कोड में बिखरे हुए समाप्त हो जाती है। लेबल और GOTO बयानों का उपयोग करके, कुछ हद तक @@ERROR का उपयोग करके त्रुटि से निपटने को केंद्रीकृत करना संभव होगा। हालाँकि, यह आज अधिकांश डेवलपर्स द्वारा एक खराब कोडिंग अभ्यास के रूप में माना जाएगा।
त्रुटि चेतावनियाँ बनाएँ
त्रुटियों की कुछ श्रेणियों के लिए, व्यवस्थापक SQL Server चेतावनियाँ बना सकते हैं, क्योंकि वे चाहते हैं कि जैसे ही ये हों, उन्हें सूचित किया जाए. यह उपयोगकर्ता-निर्धारित त्रुटि संदेशों पर भी लागू हो सकता है। उदाहरण के लिए, जब भी कोई लेन-देन लॉग भरता है, तो हो सकता है कि आप अलर्ट उठाना चाहें. चेतावनी का उपयोग आमतौर पर उच्च गंभीरता त्रुटियों (जैसे गंभीरता 19 या ऊपर) को व्यवस्थापकों के ध्यान में लाने के लिए किया जाता है।
अलर्ट उठाना
विशिष्ट त्रुटि संदेशों के लिए चेतावनियाँ बनाई जा सकती हैं. चेतावनी सेवा इवेंट लॉगिंग सेवा के साथ कॉलबैक सेवा के रूप में खुद को पंजीकृत करके काम करती है। इसका मतलब है कि अलर्ट केवल लॉग इन त्रुटियों पर काम करते हैं।
त्रुटि करने के दो तरीके हैं: अलर्ट बढ़ाएं- आप त्रुटि उठाते समय WITH LOG विकल्प का उपयोग कर सकते हैं या संदेश को sp_altermessage निष्पादित करके इसे लॉग करने के लिए बदला जा सकता है। WITH LOG विकल्प केवल वर्तमान कथन को प्रभावित करता है. sp_altermessage का उपयोग करने से भविष्य के सभी उपयोगों के लिए त्रुटि व्यवहार बदल जाता है। sp_altermessage के माध्यम से सिस्टम त्रुटियों को संशोधित करना केवल SQL Server 2005 SP3 या SQL Server 2008 SP1 से ही संभव है।