sql-server - مشاكل - مشكلة لا يمكن التعرف على تنسيق قاعدة البيانات




تحرير سجلات قاعدة البيانات من قبل مستخدمين متعددين (6)

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

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

أنا قلق أنه إذا اثنين من المستخدمين بدء تحرير نفس السجل ثم آخر لارتكاب التحديث سيكون 'الفائز' والمعلومات الهامة قد تضيع. وهناك عدد من الحلول التي تتبادر إلى الذهن ولكن لست متأكدا ما إذا كنت ذاهب لخلق صداع أكبر.

  1. لا تفعل شيئا ونأمل أن اثنين من المستخدمين لن يتم تحرير نفس السجل في نفس الوقت. - قد لا يحدث أبدا ولكن ماذا لو فعل ذلك؟
  2. يمكن تحرير روتين تخزين نسخة من البيانات الأصلية وكذلك التحديثات ومن ثم قارن عند الانتهاء من تحرير المستخدم. إذا كانت تختلف تظهر المستخدم و كومفيرم التحديث - سوف تتطلب نسختين من البيانات ليتم تخزينها.
  3. إضافة آخر تحديث عمود داتيتيم والتحقق من أنه عندما نقوم بتحديث، إن لم يكن ثم تظهر الاختلافات. - يتطلب عمود جديد في كل من الجداول ذات الصلة.
  4. أنشئ جدول تعديل يسجل عندما يبدأ المستخدمون في تعديل سجل سيتم فحصه ومنع المستخدمين الآخرين من تعديل السجل نفسه. - يتطلب فكر كارافان من تدفق البرنامج لمنع ديادلوكس والسجلات تصبح مؤمنة إذا تعطل المستخدم للخروج من البرنامج.

هل هناك أي حلول أفضل أو يجب أن أذهب لأحد هذه؟


وهناك خيار آخر هو اختبار أن القيم في سجل تغيير الخاص بك لا تزال هي نفسها كما أنها عندما بدأت:

SELECT 
    customer_nm,
    customer_nm AS customer_nm_orig
FROM demo_customer
WHERE customer_id = @p_customer_id

(عرض حقل customer_nm ويقوم المستخدم بتغييره)

UPDATE demo_customer
SET customer_nm = @p_customer_name_new
WHERE customer_id = @p_customer_id
AND customer_name = @p_customer_nm_old

IF @@ROWCOUNT = 0
    RAISERROR( 'Update failed: Data changed' );

ليس لديك لإضافة عمود جديد إلى الجدول الخاص بك (والاحتفاظ بها حتى الآن)، ولكن لديك لإنشاء المزيد من عبارات سكل مطول وتمرير حقول "جديدة" و "قديمة" إلى الإجراء المخزن.

كما أن لديها ميزة أن لا قفل السجلات - لأننا نعلم جميعا أن السجلات سوف تنتهي في نهاية المطاف البقاء مؤمنا عندما لا ينبغي أن يكون ...


سيليكت فور أوبديت ومكافئات جيدة توفر لك عقد القفل لكمية المجهرية من الزمن، ولكن لكمية المجهرية (على سبيل المثال المستخدم لديه تحميل البيانات ولم تضغط على 'حفظ' يجب عليك استخدام التزامن متفائل على النحو الوارد أعلاه. (الذي وأعتقد دائما أن اسمه هو أكثر تشاؤما من "الكاتب الأخير يفوز"، والذي عادة ما يكون البديل الآخر الوحيد الذي تم النظر فيه.)


معي، أفضل طريقة لدي عمود لاستوبديت (نوع جدول زمني). عند تحديد وتحديث مجرد مقارنة هذه القيمة مسبقا آخر من هذا الحل هو أنه يمكنك استخدام هذا العمود لتعقب البيانات الوقت قد تغير. أعتقد أنه ليس جيدا إذا كنت مجرد إنشاء كولوم مثل إيسلوك للتحديث الاختيار.


@ مارك هاريسون: سكل سيرفر لا يدعم بناء الجملة ( SELECT ... FOR UPDATE ).

المعادل سكل سيرفر هو تلميح SELECT تلميح UPDLOCK .

راجع كتب سكل سيرفر الفورية لمزيد من المعلومات.


-أول إنشاء إنشاء (تحديث الوقت) لتخزين آخر تحديث سجل -عندما يقوم أي مستخدم تحديد سجل حفظ الوقت المحدد، مقارنة بين تحديد الوقت وحقل وقت التحديث إذا (وقت التحديث)> (حدد الوقت) وهذا يعني مستخدم آخر بتحديث هذا السجل بعد تحديد سجل





database