تکنیکهای حرفهای: جلوگیری از اشتباهات گرانقیمت UPDATE و DELETE در SQL Server Management Studio
با این راهنمای جامع، میخواهیم به شما کمک کنیم تا از بروز اشتباهات پرهزینه هنگام اجرای دستورات UPDATE و DELETE در SQL Server Management Studio (SSMS) جلوگیری کنید. بسیار پیش میآید که توسعهدهندگان یا مدیران پایگاه داده، هنگام بهروزرسانی یا حذف دادهها، فراموش میکنند از عبارت WHERE استفاده کنند یا بخشی از ستونهای لازم در عبارت WHERE را از قلم میاندازند. این غفلت میتواند منجر به بهروزرسانی یا حذف ناخواسته تمام سطرها، یا تعداد بیشتری از سطرها از آنچه انتظار میرود، شود. چنین خطایی میتواند عواقب فاجعهباری داشته باشد، بهویژه اگر نسخهی پشتیبان (بکاپ) مناسبی برای بازیابی اطلاعات در دسترس نباشد، یا اگر بازیابی یک پایگاه داده بزرگ زمان زیادی ببرد.
اولین و مهمترین راهکار محافظتی که باید همیشه هنگام اجرای دستورات UPDATE یا DELETE به کار ببرید، استفاده از تراکنشها (Transaction) است. با بهکارگیری BEGIN TRAN، COMMIT TRAN، و ROLLBACK TRAN میتوانید قبل از نهایی کردن تغییرات، نتایج دستور UPDATE یا DELETE را بهدقت بررسی و تأیید کنید.
به عنوان مثال، اگر قصد بهروزرسانی رکوردهایی در جدول Orders را دارید، دستور خود را به این شکل خواهید نوشت:
BEGIN TRAN
UPDATE Orders
SET OrderStatus = 'Shipped'
WHERE OrderId = 1234
SELECT * FROM Orders WHERE OrderId = 1234
--COMMIT TRAN
--ROLLBACK TRAN
همانطور که در مثال بالا مشاهده میکنید، ابتدا تراکنش را با BEGIN TRAN شروع میکنید. سپس دستور UPDATE خود را اجرا کرده و بلافاصله پس از آن، نتایج بهروزرسانی را بررسی و تأیید میکنید. اگر نتایج دقیقا همان چیزی بود که انتظار داشتید، میتوانید با COMMIT TRAN تراکنش را نهایی کرده و تغییرات را دائمی کنید. اما اگر نتایج مطابق با انتظار شما نبود، کافی است ROLLBACK TRAN را اجرا کنید تا تمام تغییرات انجامشده به حالت قبل از شروع تراکنش بازگردند. این یک روش فوقالعاده برای اطمینان از عدم بروز هرگونه اشتباه ناخواسته است.
یک راهکار حفاظتی دیگر و بسیار مؤثر این است که همیشه قبل از اجرای دستور UPDATE یا DELETE، ابتدا یک دستور SELECT را با همان عبارت WHERE مورد نظر اجرا کنید. این کار به شما اطمینان میدهد که دقیقا ردیفهای صحیح و مدنظر شما قرار است بهروزرسانی یا حذف شوند.
به عنوان مثال، اگر قصد حذف رکوردهایی از جدول Orders را دارید، میتوانید ابتدا دستور زیر را اجرا کنید:
SELECT * FROM Orders WHERE OrderId = 1234
--DELETE FROM Orders WHERE OrderId = 1234
همانطور که مشاهده میکنید، ابتدا دستور SELECT را اجرا میکنید. اگر از این که اینها دقیقا همان رکوردهایی هستند که قصد حذفشان را دارید اطمینان پیدا کردید، میتوانید دستور DELETE را اجرا کنید. این روشی ساده اما بسیار کارآمد برای اطمینان از حذف رکوردهای صحیح است.
برای اطمینان حداکثری و انجام دقیقترین عملیات روی دادههایتان، حتی میتوانید این دو روش حفاظتی را با یکدیگر ترکیب کنید.
به عنوان مثال، اگر میخواستید رکوردهایی را از جدول Orders حذف کنید، به این شکل عمل میکنید:
BEGIN TRAN
SELECT * FROM Orders WHERE OrderId = 1234
--DELETE FROM Orders WHERE OrderId = 1234
--COMMIT TRAN
--ROLLBACK TRAN
آخرین روش محافظتی که میتوانید هنگام اجرای دستورات UPDATE یا DELETE به کار ببرید، استفاده از SET ROWCOUNT است. این دستور به شما امکان میدهد تا تعداد ردیفهایی را که قرار است بهروزرسانی یا حذف شوند، محدود کنید.
به عنوان مثال، اگر میخواستید تمام رکوردهای جدول Orders که وضعیتشان ‘Shipped’ نیست را به ‘Shipped’ تغییر دهید، اما در هر بار فقط قصد بهروزرسانی 10 رکورد را داشتید، دستور را به این شکل مینویسید:
SET ROWCOUNT 10
UPDATE Orders
SET OrderStatus = 'Shipped'
WHERE OrderStatus <> 'Shipped'
SELECT @@ROWCOUNT AS RowsUpdated
SET ROWCOUNT 0
همانطور که مشاهده میکنید، ابتدا ROWCOUNT را روی 10 تنظیم میکنید. سپس دستور UPDATE خود را اجرا میکنید. با مشاهده @@ROWCOUNT میتوانید ببینید چه تعداد ردیف بهروزرسانی شدهاند. این یک روش عالی برای انجام بهروزرسانیها به صورت دستهای است، تا همزمان کل جدول شما تحت تأثیر قرار نگیرد و بتوانید نتایج را مرحله به مرحله بررسی کنید. در نهایت، ROWCOUNT را به 0 بازمیگردانید تا بر سایر دستورات SQL شما تأثیری نگذارد.
همین کار را میتوانید برای دستور DELETE نیز انجام دهید:
SET ROWCOUNT 10
DELETE FROM Orders
WHERE OrderStatus = 'Shipped'
SELECT @@ROWCOUNT AS RowsDeleted
SET ROWCOUNT 0