محتويات الدورة

SQL Server / الأساسي / الدرس 6

الإدراج والتحديث والحذف الآمن

طبّق تعديلات مقصودة على بيانات مصطنعة وافحص الصفوف المتأثرة، وميّز المعاينة من الصحة الذرية، وتعلّم OUTPUT وفحص عدد الصفوف واسترجاع الهوية.

وقت القراءة التقريبي: 5 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • استخدام قوائم أعمدة صريحة للإدراج.
  • توقع نطاق التعديل وفحص OUTPUT.
  • شرح التحديث المشروط الذري وحدود المعاملة.

حدد انتقال الحالة المقصود

ينبغي أن يصف التعديل انتقالاً مسموحاً لا قيمة نهائية فقط. عبارة «اخفض مخزون المنتج 7 بمقدار اثنين إذا توفر اثنان» أوضح من «اجعل المخزون ثلاثة». حدد المفتاح والشرط وعدد الصفوف المتوقع ومعنى الفشل. اقرأ العبارة كاملة؛ فتؤثر UPDATE أو DELETE دون WHERE في كل صف مستهدف مؤهل.

تساعد معاينة SELECT الإنسان على مراجعة الشرط لكنها لا تحجز الصفوف. قد تغير جلسة أخرى البيانات بين المعاينة والتعديل. يجب أن تستند الصحة إلى العبارة المعدلة وقيودها وما يلزم من معاملات أو ضبط تزامن. لا تعتبر صورة المعاينة دليلاً على أن تحديثاً لاحقاً أثر في المجموعة نفسها.

أدرج أعمدة صريحة وراقب القيم

اذكر أعمدة الوجهة في INSERT حتى لو بدا ترتيب الجدول واضحاً. يجعل ذلك القصد قابلاً للمراجعة ويمنع الاعتماد على موضع العمود. تطبق DEFAULT عند حذف القيمة أو طلب DEFAULT؛ أما NULL الصريحة فتبقى NULL. يولد عمود IDENTITY قيمته عادة، ويمنح قيد أساسي أو فريد ضمان التفرد.

تعرض OUTPUT قيم الصفوف المتأثرة عبر الجدولين الوهميين inserted وdeleted. للإدراج قيم inserted، وللحذف deleted، وللتحديث كلاهما. ينشئ المثال متغير جدول فقط ويتوقع صفين، لكن ترتيب OUTPUT غير مضمون. وقد تظهر قيم OUTPUT حتى إذا حدث خطأ لاحق وتراجع التعديل؛ لذا يتطلب إثبات النجاح فحص اكتمال الأمر ونتيجة المعاملة.

sql راقب المعرفات المولدة
DECLARE @t TABLE (Id int IDENTITY(1,1) PRIMARY KEY, Name nvarchar(30));
INSERT @t(Name)
OUTPUT inserted.Id,inserted.Name
VALUES (N'Aya'),(N'Omar');
SELECT Id,Name FROM @t ORDER BY Id;
الناتج المتوقع
Final SELECT:
Id Name
1  Aya
2  Omar

يرتب SELECT النهائي الصفوف صراحة، أما ترتيب OUTPUT نفسه فغير محدد.

ضع أهلية التعديل داخل UPDATE

يقرأ التحديث الحسابي قيمة الهدف ويكتبها في عبارة واحدة. يتجنب Stock = Stock - @qty مع Stock >= @qty سباق القراءة ثم الكتابة الواضح عند حساب القيمة في ذاكرة التطبيق. افحص @@ROWCOUNT فوراً لأن العبارات اللاحقة قد تستبدله. قد يعني الصفر غياب المنتج أو نقص المخزون؛ قرر هل تميّز الواجهة الحالتين.

يبدأ المثال بخمس وحدات ويطلب اثنتين، فيسمح الشرط بالانتقال وتعرض OUTPUT تغير خمسة إلى ثلاثة. تحقق من أن الكمية موجبة قبل هذا النمط؛ فطرح كمية سالبة يزيد المخزون. يوفر CHECK دفاعاً آخر ضد المخزون السالب. وعندما يرتبط التغيير بإدراج طلب، تظل صحة التزامن بحاجة إلى تصميم المعاملة كاملة.

sql إنقاص مخزون محمي بشرط
DECLARE @Stock TABLE (ProductId int PRIMARY KEY, Quantity int CHECK (Quantity>=0));
INSERT @Stock VALUES (7,5);
DECLARE @qty int=2;
UPDATE @Stock SET Quantity=Quantity-@qty
OUTPUT deleted.Quantity AS before_qty,inserted.Quantity AS after_qty
WHERE ProductId=7 AND Quantity>=@qty AND @qty>0;
DECLARE @changed int=@@ROWCOUNT;
SELECT @changed AS changed;
الناتج المتوقع
before_qty after_qty
5          3

changed
1

يُحفظ عدد الصفوف قبل أن تغيره عبارة أخرى؛ وطلب ست وحدات لن يعدل أي صف.

عامل الحذف والتقسيم كقرارات تصميم

تحذف DELETE الصفوف مع مراعاة القيود والمحفزات؛ ولـ TRUNCATE قيود ودلالات مختلفة، فلا تعد بديلاً مريحاً لحذف مشروط. قد ترفض المفاتيح الخارجية حذف آباء مرجوع إليهم. والحذف المتسلسل سياسة مخطط صريحة قد تتسع آثارها. راجع الاحتفاظ والتدقيق وخيارات الاسترداد قبل تصميم إزالة دائمة.

لا تحدد DELETE TOP (100) أقدم مئة صف وحدها. لاختيار دفعات مرتبة، اختر المفاتيح عبر TOP وORDER BY داخل استعلام فرعي أو CTE، ثم احذف تلك المفاتيح ضمن تصميم معاملة مناسب. تحتاج الدفعات المتكررة شرط تقدم؛ وإلا فقد تعيد زيارة صفوف أو تؤثر في مجموعة أهلية متغيرة بصورة مفاجئة.

تحقق من نتيجة مكتملة

تعيد SCOPE_IDENTITY آخر هوية مولدة ضمن النطاق الحالي، بينما قد تتأثر @@IDENTITY بنطاق آخر مثل محفز. ولإدراج عدة صفوف فضّل OUTPUT لاسترجاع مجموعة المعرفات. لا يثبت كبر الهوية أو فجواتها عدد الصفوف المثبتة؛ تتبع النجاح عبر بروتوكول الأمر والمعاملة.

تشرح مراجعة التعديل المكتملة الحالة السابقة والمتوقعة والقيود وعدد الصفوف والتصرف عند الفشل. تظهر الأمثلة المصطنعة الصغيرة هذه الالتزامات بوضوح. سنجمع التعديلات لاحقاً في TRY/CATCH ومعاملة صريحة. ميّز الآن نجاح العبارة وتثبيت المعاملة ووصول التأكيد إلى التطبيق؛ فهي أحداث منفصلة لها أنماط فشل مختلفة.

الأخطاء الشائعة وإصلاحها

Every row changed.

لماذا يحدث؟
حُذف شرط WHERE أو أُضعف.
كيف تصلحه؟
استعد البيانات بعملية استرداد معتمدة وصحح الشرط وراجعه في التدريب.
كيف تتجنب تكراره؟
اشترط مفاتيح هدف وعدد صفوف متوقعاً.

The DELETE statement conflicted with the REFERENCE constraint.

لماذا يحدث؟
ما زالت صفوف أبناء تشير إلى الأب.
كيف تصلحه؟
طبق سياسة الاحتفاظ الموثقة وترتيب الاعتماد الصحيح.
كيف تتجنب تكراره؟
صمّم سياسة الحذف مع المفاتيح الخارجية.

Stock increased for a sale.

لماذا يحدث؟
طُرحت كمية مطلوبة سالبة.
كيف تصلحه؟
ارفض الكميات غير الموجبة وأبق قيود القاعدة.
كيف تتجنب تكراره؟
اختبر الصفر والسالب والزائد والطلب العادي.

اختبر فهمك

1. المخزون 5 ويريد عميلان 4 لكل منهما. لماذا لا تؤمن القراءة ثم SET Stock=1؟

اعرض الحل المشروح

قد يقرأ الاثنان 5 ويكتبان 1 فيقبل النظام بيع ثماني وحدات. يسمح التحديث الحسابي المشروط بإنقاص واحد؛ ويرى الطلب اللاحق مخزوناً غير كافٍ فلا يعدل صفاً وفق دلالات القفل المعتادة.

2. يدرج محفز هوية تدقيق بعد إدراج عميل. كيف تسترجع الهوية؟

اعرض الحل المشروح

استخدم OUTPUT inserted.CustomerId لمجموعة العملاء المدرجة أو SCOPE_IDENTITY لهوية واحدة في نطاق المستدعي. تجنب @@IDENTITY لأن المحفز قد يغيرها. تحقق من التثبيت قبل إعلان نجاح دائم.

أهم ما تعلمته

  • توثّق الأعمدة الصريحة وشروط الأهلية التعديلات.
  • احفظ عدد الصفوف المتأثرة فوراً.
  • ليست القيم المعروضة دليلاً على تثبيت المعاملة.

المراجع الرسمية