जब BACKUP DATABASE
कोई त्रुटि उत्पन्न करता है, तो यह वास्तव में दो उत्पन्न करता है। दुर्भाग्य से TRY/CATCH
पहली त्रुटि को पकड़ने में सक्षम नहीं है; यह केवल दूसरी त्रुटि पकड़ता है।
मैं आपका सर्वश्रेष्ठ दांव असली कारण पर कब्जा करने के पीछे एक असफल बैकअप के माध्यम से अपने बैकअप को स्वचालित करने के लिए है पर शक SQLCMD (साथ -o
एक फाइल करने के लिए उत्पादन भेजने के लिए), लघु उद्योगों, सी #, PowerShell आदि सभी जिनमें से आप बहुत अधिक नियंत्रण पर कब्जा करने से अधिक दे देंगे सभी त्रुटियों की।
टिप्पणी में SO उत्तर का उपयोग करने का सुझाव देता है DBCC OUTPUTBUFFER
- जबकि यह संभव है, यह बिल्कुल भी बच्चे के खेल की तरह नहीं लगता है। Erland Sommarskog की साइट से इस प्रक्रिया के साथ मज़े करने के लिए स्वतंत्र महसूस करें , लेकिन यह अभी भी संयोजन के साथ अच्छी तरह से काम नहीं करता है TRY/CATCH
।
एकमात्र तरीका मुझे लगता है कि त्रुटि संदेश को कैप्चर करने में सक्षम होना चाहिए spGET_LastErrorMessage
, अगर वास्तविक त्रुटि फेंक दी जाती है। यदि आप इसे एक TRY/CATCH
त्रुटि में लपेटते हैं तो निगल लिया जाता है और संग्रहीत कार्यविधि कुछ नहीं करती है:
BEGIN TRY
EXEC sp_executesql N'backup that fails...';
END TRY
BEGIN CATCH
EXEC dbo.spGet_LastErrorMessage;
END CATCH
SQL सर्वर <2012 में आप स्वयं त्रुटि दोबारा नहीं उठा सकते, लेकिन आप SQL सर्वर 2012 और नए में कर सकते हैं। तो ये दो भिन्नताएँ काम करती हैं:
CREATE PROCEDURE dbo.dothebackup
AS
BEGIN
SET NOCOUNT ON;
EXEC sp_executesql N'backup that fails...';
END
GO
EXEC dbo.dothebackup;
EXEC dbo.spGET_LastErrorMessage;
या 2012 और इसके बाद के संस्करण में, यह काम करता है, लेकिन एक बड़ी डिग्री के उद्देश्य को हरा देता है TRY/CATCH
, क्योंकि मूल त्रुटि अभी भी फेंक दी जाती है:
CREATE PROCEDURE dbo.dothebackup2
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
EXEC sp_executesql N'backup that fails...';
END TRY
BEGIN CATCH
THROW;
END CATCH
END
GO
EXEC dbo.dothebackup2;
EXEC dbo.spGET_LastErrorMessage;
इन दोनों मामलों में, त्रुटि अभी भी ग्राहक को फेंक दी गई है, निश्चित रूप से। इसलिए यदि आप TRY/CATCH
उससे बचने के लिए उपयोग कर रहे हैं , जब तक कि कुछ खामी नहीं है, जिसके बारे में मैं नहीं सोच रहा हूं, मुझे डर है कि आपको चुनाव करना होगा ... या तो उपयोगकर्ता को त्रुटि दें और उसके बारे में विवरण कैप्चर करने में सक्षम हों यह, या त्रुटि और वास्तविक कारण दोनों को दबा देता है।