যখন BACKUP DATABASE
ত্রুটি উত্পন্ন হয়, এটি আসলে দুটি উত্পন্ন করে। দুর্ভাগ্যক্রমে TRY/CATCH
প্রথম ত্রুটি ক্যাপচার করতে সক্ষম নয়; এটি কেবল দ্বিতীয় ত্রুটি ক্যাপচার করে।
আমি আপনার সেরা বাজি আসল কারণ ক্যাপচার পিছনে একটি ব্যর্থ ব্যাকআপ মাধ্যমে আপনার ব্যাকআপ স্বয়ংক্রিয় হয় সন্দেহ SQLCMD (সঙ্গে -o
একটি ফাইল আউটপুট পাঠাতে), SSIS, সি #, PowerShell ইত্যাদি সমস্ত যা আপনার অনেক বেশি নিয়ন্ত্রণ ধরে রাখার তুলে দেব সব ত্রুটি।
মন্তব্যে এসও উত্তরটি ব্যবহারের পরামর্শ দেয় DBCC OUTPUTBUFFER
- এটি সম্ভব হওয়ার পরেও এটিকে মোটেই বাচ্চাদের খেলার মতো মনে হয় না। এরল্যান্ড سومমারস্কোগের সাইট থেকে এই পদ্ধতিটি নিয়ে নির্দ্বিধায় মজা পান তবে এটি এখনও মিলবে না বলে মনে হয় 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
এসকিউএল সার্ভার <2012 এ আপনি নিজেই ত্রুটিটি পুনরায় উত্থাপন করতে পারবেন না তবে আপনি এসকিউএল সার্ভার 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
এড়াতে ব্যবহার করেন তবে যদি এমন কিছু ফাঁক না হয় যার বিষয়ে আমি ভাবছি না, তবে আমি ভয় করি আপনার একটি পছন্দ করতে হবে ... হয় ব্যবহারকারীকে ত্রুটি দিন এবং তার সম্পর্কে বিশদ বিবরণ ক্যাপচার করতে সক্ষম হবেন এটি, বা ত্রুটি এবং আসল কারণ উভয়ই দমন করে।