ERROR در استور پروسیجیر  در پایگاه  داده SQL

تیم تحریریه 1404/01/22 0 83
لینک کوتاه https://www.zoheirsoftware.com/z/4ed59716e |
ERROR در استور پروسیجیر  در پایگاه  داده SQL,کاربردهای ERROR در استور پروسیجرها,مزایای مدیریت خطا (ERROR Handling) در Stored Procedure

ERROR در استور پروسیجر در پایگاه داده SQL

در SQL Server، مدیریت خطاها بخش مهمی از برنامه‌نویسی است که به طور خاص در استور پروسیجرها اهمیت زیادی دارد.

برای مدیریت خطاها و بازیابی اطلاعات مربوط به آن‌ها در هنگام وقوع، SQL Server ابزارهایی همچون ERROR_NUMBER(), ERROR_MESSAGE(), ERROR_SEVERITY(), ERROR_STATE و ()ERROR_LINE فراهم کرده است.

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

در SQL Server، ERROR_NUMBER یک تابع سیستم است که به شما اجازه می‌دهد شماره خطای مربوط به آخرین خطا را که در یک جلسه جاری اتفاق افتاده است، دریافت کنید.

این تابع معمولاً در داخل بلوک‌های TRY...CATCH استفاده می‌شود.

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

 

 

ERROR در استور پروسیجر در پایگاه داده SQL

 

 

ساختار کلی دستور ()ERROR_NUMBER

ERROR_NUMBER()

این دستور شماره خطای آخرین خطای رخ داده در یک جلسه یا تراکنش خاص را باز می‌گرداند.

شماره خطا به صورت عددی برگشت داده می‌شود که می‌تواند به شما در شناسایی نوع خطا کمک کند.

کاربردهای ERROR در استور پروسیجرها

در استور پروسیجرها، از ()ERROR_NUMBER می‌توان برای شناسایی و مدیریت خطاها در زمانی که یک عملیات ناموفق انجام می‌شود، استفاده کرد.

معمولاً از این تابع در داخل بلوک‌های TRY...CATCH استفاده می‌شود که برای کنترل و مدیریت خطاهای احتمالی در داخل استور پروسیجر طراحی شده‌اند.

  • شناسایی و مدیریت خطاهای درون استور پروسیجر

    فرض کنید یک استور پروسیجر دارید که یک عملیات به‌روزرسانی را در جدول انجام می‌دهد.
    اگر این عملیات به هر دلیلی شکست بخورد، می‌توانید از ERROR_NUMBER() برای شناسایی و گزارش خطا استفاده کنید.
CREATE PROCEDURE UpdateProductPrice
    @ProductID INT,
    @NewPrice DECIMAL(10,2)
AS
BEGIN
    BEGIN TRY
        -- به‌روزرسانی قیمت محصول
        UPDATE Products
        SET Price = @NewPrice
        WHERE ProductID = @ProductID;
    END TRY
    BEGIN CATCH
        -- مدیریت خطا در صورت بروز
        DECLARE @ErrorNumber INT;
        SET @ErrorNumber = ERROR_NUMBER();  -- دریافت شماره خطا

        -- چاپ شماره خطا
        PRINT 'Error Number: ' + CAST(@ErrorNumber AS NVARCHAR(10));
        
        -- انجام اقدامات اضافی مانند ثبت خطا یا ارسال پیام به کاربر
        -- برای مثال می‌توان پیام خطا را به یک جدول لاگ خطا ثبت کرد
        INSERT INTO ErrorLogs (ErrorNumber, ErrorMessage, ErrorDate)
        VALUES (@ErrorNumber, ERROR_MESSAGE(), GETDATE());
        
        -- نمایش پیغام خطا
        RAISERROR('Operation failed with error number: %d', 16, 1, @ErrorNumber);
    END CATCH
END;


در این مثال

    • ابتدا در داخل بخش TRY تلاش می‌شود که قیمت محصول به‌روزرسانی شود.
    • اگر خطایی در این عملیات رخ دهد، کنترل به بخش CATCH منتقل می‌شود.
    • در بخش CATCH, از تابع ERROR_NUMBER() برای دریافت شماره خطا استفاده می‌شود.
    • سپس این شماره خطا و پیام خطا به یک جدول ErrorLogs برای ثبت لاگ خطا وارد می‌شود.
    • در نهایت، با استفاده از RAISERROR, پیامی با شماره خطا به کاربر ارسال می‌شود.
  • شناسایی نوع خطا و انجام اقدامات خاص

    در بسیاری از مواقع، ممکن است بخواهید نوع خاصی از خطاها را شناسایی کرده و اقدامات خاصی برای آن‌ها انجام دهید.
    برای مثال، اگر خطای مربوط به دسترسی به جدول رخ دهد، ممکن است بخواهید تراکنش را بازنشانی کنید یا عملیات خاصی را انجام دهید.
CREATE PROCEDURE UpdateProductPrice
    @ProductID INT,
    @NewPrice DECIMAL(10,2)
AS
BEGIN
    BEGIN TRY
        -- به‌روزرسانی قیمت محصول
        UPDATE Products
        SET Price = @NewPrice
        WHERE ProductID = @ProductID;
    END TRY
    BEGIN CATCH
        -- دریافت شماره خطا
        DECLARE @ErrorNumber INT;
        SET @ErrorNumber = ERROR_NUMBER();

        -- شناسایی نوع خاصی از خطا و انجام اقدامات ویژه
        IF @ErrorNumber = 547  -- خطای مربوط به محدودیت خارجی (Foreign Key constraint violation)
        BEGIN
            PRINT 'Foreign key constraint violation occurred.';
            -- عملیات مورد نظر برای این نوع خطا
        END
        ELSE IF @ErrorNumber = 2627  -- خطای مربوط به نقض محدودیت یکتا (Unique constraint violation)
        BEGIN
            PRINT 'Unique constraint violation occurred.';
            -- عملیات مورد نظر برای این نوع خطا
        END
        ELSE
        BEGIN
            -- سایر خطاها را مدیریت می‌کنیم
            PRINT 'An unexpected error occurred.';
        END
    END CATCH
END;


در این مثال

    • با استفاده از تابع ()ERROR_NUMBER , شماره خطای بلافاصله پس از وقوع آن در بخش CATCH دریافت می‌شود.
    • سپس با استفاده از شماره خطا، نوع خطای خاص شناسایی می‌شود.
    • برای مثال، شماره خطای 547 مربوط به نقض محدودیت خارجی است و شماره خطای 2627 مربوط به نقض محدودیت یکتاست.
    • بسته به نوع خطا، اقدامات متفاوتی انجام می‌شود.
  • ارسال پیام خطا به کاربر

    یکی از کاربردهای رایج ()ERROR_NUMBER در استور پروسیجرها، ارسال پیام خطا به کاربر است.
    به‌ویژه در محیط‌های عملیاتی، بسیار مهم است که پیغام‌های خطا به صورت واضح و دقیق به کاربر نمایش داده شوند.

 

CREATE PROCEDURE ProcessTransaction
    @AccountID INT,
    @Amount DECIMAL(10,2)
AS
BEGIN
    BEGIN TRY
        -- فرض کنید می‌خواهیم موجودی حساب را کاهش دهیم
        DECLARE @Balance DECIMAL(10,2);
        SELECT @Balance = Balance FROM Accounts WHERE AccountID = @AccountID;
        
        IF @Balance < @Amount
        BEGIN
            -- اگر موجودی کافی نباشد، یک خطا ایجاد می‌کنیم
            THROW 50001, 'Insufficient balance.', 1;
        END
        
        UPDATE Accounts
        SET Balance = Balance - @Amount
        WHERE AccountID = @AccountID;
        
    END TRY
    BEGIN CATCH
        -- دریافت شماره خطا
        DECLARE @ErrorNumber INT;
        SET @ErrorNumber = ERROR_NUMBER();
        
        -- ارسال پیام خطا به کاربر
        PRINT 'Transaction failed with error number: ' + CAST(@ErrorNumber AS NVARCHAR(10));
        
        -- ثبت خطا در جدول لاگ
        INSERT INTO ErrorLogs (ErrorNumber, ErrorMessage, ErrorDate)
        VALUES (@ErrorNumber, ERROR_MESSAGE(), GETDATE());
    END CATCH
END;


در این مثال

    • در صورتی که موجودی حساب برای انجام تراکنش کافی نباشد، با استفاده از دستور THROW, یک خطا ایجاد می‌شود.
    • در بخش CATCH, تابع ()ERROR_NUMBER شماره خطا را دریافت کرده و آن را به کاربر نمایش می‌دهد.
    • همچنین، خطا در جدول ErrorLogs برای پیگیری و مدیریت بعدی ثبت می‌شود.

کاربردهای ERROR در استور پروسیجرها

 

مدیریت خطاها با استفاده از سایر توابع

در کنار ()ERROR_NUMBER, سایر توابع SQL Server نیز برای مدیریت خطاها مفید هستند.

در زیر، به معرفی این توابع و نحوه استفاده از آن‌ها در استور پروسیجرها می‌پردازیم:

()ERROR_MESSAGE
این تابع پیام مربوط به آخرین خطای رخ داده را باز می‌گرداند.

DECLARE @ErrorMessage NVARCHAR(4000);
SET @ErrorMessage = ERROR_MESSAGE();
PRINT @ErrorMessage;
ERROR_SEVERITY()


این تابع سطح خطای رخ داده را باز می‌گرداند. سطح خطا معمولاً عددی بین 0 تا 25 است که نشان‌دهنده شدت خطا است.

 

DECLARE @ErrorSeverity INT;
SET @ErrorSeverity = ERROR_SEVERITY();
PRINT @ErrorSeverity;
ERROR_STATE()


این تابع وضعیت خطا را باز می‌گرداند که به شما کمک می‌کند تا جزئیات دقیق‌تری از وقوع خطا داشته باشید.

 

DECLARE @ErrorState INT;
SET @ErrorState = ERROR_STATE();
PRINT @ErrorState;
ERROR_LINE()


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

DECLARE @ErrorLine INT;
SET @ErrorLine = ERROR_LINE();
PRINT @ErrorLine;

 

 

 

🌟 آیا می‌خواهید به یک متخصص پایگاه داده تبدیل شوید و در دنیای فناوری اطلاعات بدرخشید؟

با دوره آموزشی SQL Server ما، شما می‌توانید به راحتی و با روشی عملی، تمام مهارت‌های لازم را یاد بگیرید!

این دوره به شما آموزش می‌دهد که چگونه داده‌ها را به بهترین شکل مدیریت کنید، گزارش‌های قدرتمند بسازید و به تحلیل‌های عمیق دست یابید.

با محتوای جذاب و پروژه‌های واقعی، شما نه تنها تئوری را یاد می‌گیرید، بلکه توانایی‌های عملی خود را نیز تقویت می‌کنید.

پس فرصت را از دست ندهید! همین امروز به جمع یادگیرندگان ما بپیوندید و اولین قدم را به سوی آینده شغلی روشن‌تر بردارید!

 همین حالا شروع کنید و به دنیای داده‌ها بپیوندید!

 

 

 

مزایای مدیریت خطا (ERROR Handling) در Stored Procedure

  • افزایش پایداری سیستم (Stability)

    وقتی خطاها کنترل بشن، کل سیستم یا عملیات DB ناگهانی متوقف نمی‌شه و باعث crash نمی‌شه.
  • جلوگیری از خراب شدن داده‌ها

    با استفاده از Transaction + Try/Catch می‌تونی در صورت خطا، تغییرات رو Rollback کنی و از خراب شدن دیتابیس جلوگیری کنی.
  • ارائه پیام‌های خطای قابل فهم

    می‌تونی پیام‌های خطا رو سفارشی کنی یا لاگ بگیری، تا برنامه‌نویس‌ها یا کاربرها راحت‌تر بفهمن چی شده.
  • امکان Retry یا مسیر جایگزین

    میتونی اگه یه عملیات خاص شکست خورد (مثلاً اتصال به سرور دوم)، به صورت خودکار یه روش جایگزین اجرا کنی.
  • سهولت در اشکال‌زدایی (Debugging)

    وقتی با ERROR_MESSAGE()، ERROR_LINE()، ERROR_NUMBER() و... اطلاعات رو ثبت می‌کنی، بعداً راحت‌تر می‌فهمی مشکل کجا بوده.
  • قابلیت لاگ‌گیری دقیق از خطاها

    مدیریت خطا بهت این فرصت رو می‌ده که همه خطاها رو توی یه جدول Log ذخیره کنی، برای تحلیل، گزارش‌گیری یا حتی بررسی حملات امنیتی.
  • کنترل دقیق رفتار برنامه در خطا

    به‌جای اینکه برنامه با خطا کرش کنه، می‌تونی خودت تعیین کنی چه واکنشی نشون بده (مثلاً پیام خاص بده، یا مرحله خاصی رو رد کنه).

 

 

 

مزایای مدیریت خطا (ERROR Handling) در Stored Procedure

دوره های مرتبط
آموزش Sql,آموزش sqlserver, آموزش جامع Sqlserver

آموزش پایگاه داده SqlServer

پایگاه داده Sqlserver یکی از پایگاه داده های مهم برای ذخیره اطلاعات محسوب میشود .

997,000 تومان

2.7k بازدید

ارسال دیدگاه

برای ارسال نظر لطفا ورود یا ثبت نام کنید.