مدیریت خطاها در دیتابیس

دیتابیس، خطاهای دیتابیس، خطا در sql server، مدیریت خطا 1404/6/31
نویسنده: مدرس بهمن آبادی

مدیریت خطاها در دیتابیس

مدیریت خطا در دیتابیس

مقدمه

در پایگاه داده‌ها، به‌ویژه SQL Server، خطاها بخش جدایی‌ناپذیر از کار هستند. خطاها می‌توانند ناشی از اشتباهات برنامه‌نویسی، داده‌های ورودی نامعتبر یا مشکلات سیستمی باشند. اگر این خطاها مدیریت نشوند، ممکن است باعث ناقص ماندن داده‌ها، قفل شدن منابع یا حتی از بین رفتن یکپارچگی پایگاه داده شوند.

SQL Server امکاناتی مانند TRY...CATCH، دستور THROW و RAISERROR را برای مدیریت خطاها فراهم کرده است. هدف از این مقاله، آشنایی با روش‌های مدیریت خطا و نشان دادن اهمیت آن در تراکنش‌هاست.

ساختار TRY...CATCH

اساسی‌ترین ابزار برای مدیریت خطا در SQL Server، بلوک TRY...CATCH است.
ساختار آن به شکل زیر است:

هر دستوری که در بلوک TRY خطا تولید کند، اجرای آن متوقف شده و کنترل به بلوک CATCH منتقل می‌شود.

مثال اول: مدیریت خطای ساده (تقسیم بر صفر)

در این مثال، یک خطای ساده مانند تقسیم بر صفر را مدیریت می‌کنیم.

BEGIN TRY
    DECLARE @x INT = 10, @y INT = 0;
    SELECT @x / @y AS Result;
END TRY
BEGIN CATCH
    PRINT 'یک خطا رخ داد.';
    SELECT ERROR_NUMBER() AS ErrorNumber,
           ERROR_MESSAGE() AS ErrorMessage;
END CATCH;

 در این حالت، خطای تقسیم بر صفر رخ می‌دهد و پیام خطا همراه با شماره‌ی آن نمایش داده می‌شود.

مثال دوم: استفاده از THROW برای تولید خطا

گاهی لازم است به صورت دستی یک خطا ایجاد کنیم (مثلاً وقتی داده‌ی ورودی درست نیست).

BEGIN TRY
    DECLARE @username NVARCHAR(50) = NULL;

    IF @username IS NULL
        THROW 50001, N'نام کاربری نمی‌تواند خالی باشد.', 1;
END TRY
BEGIN CATCH
    SELECT ERROR_NUMBER() AS ErrorNumber,
           ERROR_MESSAGE() AS ErrorMessage;
END CATCH

در این مثال اگر نام کاربری مقدار نداشته باشد، ما عمداً خطا تولید می‌کنیم و در بلوک CATCH آن را مدیریت می‌کنیم.

مثال سوم: مدیریت خطا در تراکنش‌ها

اینجا اهمیت مدیریت خطا بیشتر می‌شود. فرض کنید می‌خواهیم دو جدول را همزمان به‌روزرسانی کنیم. اگر یکی موفق شود و دیگری شکست بخورد، ممکن است داده‌ها ناسازگار شوند. بنابراین از تراکنش و مدیریت خطا استفاده می‌کنیم:

BEGIN TRY
    BEGIN TRANSACTION;

    -- درج در جدول مشتریان
    INSERT INTO Customers (CustomerName, Email)
    VALUES (N'علی رضایی', 'ali@example.com');

    -- درج در جدول سفارش‌ها (اشتباه عمدی: ستون وجود ندارد)
    INSERT INTO Orders (CustomerId, FakeColumn)
    VALUES (SCOPE_IDENTITY(), 1000);

    -- اگر همه چیز درست بود
    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    -- در صورت خطا
    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION;

    PRINT 'خطا رخ داد و تراکنش بازگشت داده شد.';
    SELECT ERROR_NUMBER() AS ErrorNumber,
           ERROR_MESSAGE() AS ErrorMessage;
END CATCH;

در اینجا:

  1. تراکنش آغاز می‌شود.

  2. اگر درج در هر مرحله شکست بخورد، کل تراکنش Rollback می‌شود.

  3. این کار باعث می‌شود داده‌ها ناقص یا ناسازگار ذخیره نشوند

جمع‌بندی

  • مدیریت خطا در SQL Server حیاتی است تا از یکپارچگی داده‌ها محافظت شود.

  • ابزار اصلی مدیریت خطا TRY...CATCH است.

  • برای تولید خطاهای سفارشی می‌توان از THROW استفاده کرد.

  • در تراکنش‌ها، مدیریت خطا ضروری‌تر است زیرا مانع از ذخیره‌سازی ناقص داده‌ها می‌شود.

با استفاده از این روش‌ها، می‌توان پایگاه داده‌ای پایدارتر و قابل اطمینان‌تر ایجاد کرد.