وحدة اختبار البيانات DDL التي تحتاج إلى أن تكون في معاملة

StackOverflow https://stackoverflow.com/questions/892923

سؤال

أنا أعمل في تطبيق يستخدم آليات مصادقة Oracle المدمجة لإدارة حسابات المستخدمين وكلمات المرور. يستخدم التطبيق أيضا أمان مستوى الصف الصف. في الأساس كل مستخدم يسجل من خلال التطبيق يحصل على اسم مستخدم وكلمة مرور Oracle بدلا من الإدخال النموذجي في جدول "المستخدمين". يتلقى المستخدمون أيضا ملصقات على طاولات معينة. يتطلب هذا النوع من الوظائف أن يتم دمج تنفيذ عبارات DML و DDL في العديد من الحالات، ولكن هذا يمثل مشكلة لأن بيانات DDL تقوم بإجراء ارتكاب ضمني. في حالة حدوث خطأ بعد تنفيذ عبارة DDL، لن تقوم إدارة المعاملات بلف كل شيء مرة أخرى. على سبيل المثال، عندما يسجل مستخدم جديد مع النظام، قد يحدث ما يلي:

  1. بدء المعاملة
  2. إدراج تفاصيل الشخص في جدول. (أي الاسم الأول، الاسم الأخير، إلخ) -dml
  3. إنشاء حساب Oracle (إنشاء اختبار المستخدم الذي تم تحديده بواسطة كلمة المرور؛) الالتزام الضمني - DDL. ينتهي المعاملة.
  4. معاملة جديدة تبدأ.
  5. قم بإجراء المزيد من بيانات DML (إدراج وتحديثات، إلخ).
  6. يحدث خطأ، والمعاملة تدور فقط مرة أخرى إلى الخطوة 4.

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

هذا هو تطبيق Java / Spring. الربيع يوفر إدارة المعاملات.

هل كانت مفيدة؟

المحلول

يجب عليك استخدام مصادقة Oracle Proxy في تركيبة مع أمان مستوى الصف.

اقرا هذا: http://www.oracle.com/technology/pub/articles/dikmans-toplink-security.html.

نصائح أخرى

أولا، يجب أن أقول: فكرة سيئة تفعل ذلك بهذه الطريقة. لسببين:

  1. تعتمد الاتصالات على المستخدم. وهذا يعني أنك تفقد إلى حد كبير فوائد تجمع الاتصالات. كما أنها لا الحجم بشكل جيد بشكل رهيب. إذا كان لديك 10000 مستخدم في وقت واحد، فسوف تفتح باستمرار وإغلاق الاتصالات الصلبة (بدلا من تجمعات الاتصال الناعمة)؛ و
  2. كما اكتشفت، فإن إنشاء وإزالة المستخدمين غير DML وليس DML وبالتالي فقد تفقد "المعاملات".

لست متأكدا من سبب اختيارك للقيام بذلك، لكنني سأفعل بقوة يوصي بتنفيذ المستخدمين في التطبيق وليس طبقة قاعدة البيانات.

أما بالنسبة لكيفية حل مشكلتك، في الأساس لا يمكنك ذلك. كما هو الحال إذا كنت تقوم بإنشاء جدول أو فهرس في منتصف التسلسل الخاص بك.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top