تکنیکهای حرفهای: جلوگیری از اشتباهات گرانقیمت 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