دسته بندی مقالات
- بیشتر -محصولات
- بیشتر -آخرین مقالات
- بیشتر --
کنترل ListBox در سی شارپ
1404/02/07 -
مدیریت تراکنش در پایگاه داده SQL
1404/02/06 -
کنترل LinkLable در سی شارپ
1404/02/05 -
عملگر تراکنش در پایگاه داده SQL
1404/02/02 -
کنترل Label در سی شارپ
1404/01/31 -
دستورات و فرامین تراکنش در پایگاه داده SQL
1404/01/30
ERROR در استور پروسیجیر در پایگاه داده SQL

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_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_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 ذخیره کنی، برای تحلیل، گزارشگیری یا حتی بررسی حملات امنیتی. -
کنترل دقیق رفتار برنامه در خطا
بهجای اینکه برنامه با خطا کرش کنه، میتونی خودت تعیین کنی چه واکنشی نشون بده (مثلاً پیام خاص بده، یا مرحله خاصی رو رد کنه).
دوره های مرتبط

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