الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيفية دمج البيانات لقاعدة بيانات واحدة على 3 أجهزة مختلفة

بدأه asiri6 في 7 ديسمبر 2012 · 8 رد · 1,156 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

بداية أحب أن أشكر كل العاملين على هذا المنتدى ، وكل الأعضاء الفاعلين فيه ، كما أشكر كل من ساعدني بمعلومة أو مدني بنصيحة

سؤالي

لدي سيرفر + 3 أجهزة أخرى غير مرتبطين بالسيرفر ، والسيرفر والأجهزة الأخرى بهما نفس البرنامج ونفس قاعدة البيانات SQL SERVER ( نفس الجداول والحقول ) ، مع العلم أن البرنامج معمول بلغة #C ،

طبعاً البيانات الموجودة بالسيرفر والأجهزة الثلاثة الأخرى تختلف عن بعضها البعض ، كون كل واحد يعمل مستقل عن الآخر ، سؤالي وهو المهم

كيف استطيع دمج البيانات المختلفة والموجودة في الأجهزة الثلاثة مع البيانات الموجودة في السيرفر ، بحيث في النهاية أحصل على بيانات كاملة تضم جميع البيانات التي في السيرفر + البيانات الموجود في الأجهزة الثلاثة الأخرى ، وتكون جميع

البيانات متاحة على السيرفر.

#2

وعليكم السلام و رحمة الله و بركاته

خذ نسخ من قواعد البيانات الثلاثة و أدمجها في قاعدة جديدة أو إحدى القواعد الموجودة.

Concatenate tables ....

#3

ولكن أخي تبقى هناك مشكلة وهي مسألة تكرار قيم الحقول المفتاحية

بمعنى طالما لديك نفس الجداول في القواعد الأربعة هذا يعني أن لهم نفس العمود المفتاحي وخاصة إذا كان تلقائي

مما يعني أنه من المحتمل جدا بل أكيد أن تتكرر القيم المفتاحية كمثال الكل سيبدأ برقم واحد

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

ويمكن تجاوز حل مثل هذه المشكلة إذا جعلت كل مفتاح في الأجهزة الأربعة يبدأ الترقيم من رقم مختلف

كأن تتوقع أن سجلات كل جدول لن تتجاوز 10000 حينها تعطي للسيرفر البدء من 1 والجهاز الأول يبدأ ترقيم القيم المفتاحية من 10000 والثاني من 20000 والثالث من 30000

وهكذا لتضمن أنه لن يكون هناك تكرار وعند إضافة السجلات إلى بعضها البعض لن يحدث اعتراض

وتبقى المشكلة في حال تجاوز أحدهم ال 10000 حينها سيدخل إلى مجال ترقيم الجهاز الآخر

لذا كلما كبرت المجال أفضل

بالنسبة للجمع من خلال كويري قم ببرمجته يأخذ من الجداول السجلات ويعمل لها Insert في الجدول الهدف وليكن السيرفر

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#4

السلام عليكم

أشكر كل من رد على استفساري وجزاه الله خير

ولكن لدي استفسارين

الأول بخصوص الحقول المفتاحية االتي تولد الرقم تلقائي, هل بالإمكان أن أجعل كل حقل تلقائي في كل جهاز يبدأ بحرف مثلاً السيرفر حرف S والأجهزة الأخرى كل منها حرف يختلف عن الآخر وبالتالي يسهل إدراج البيانات في السيرفر,

الاستفسار الثاني ما هو الكود المطلوب لعمل ذلك, وهل بالإمكان أن يعمل كود بحيث يتم تنفيذه وتدرج البيانات في السيرفر بطريقة آلية

#5

أخي خاصية الزيادة التلقائية لا تكون إلا لحقل من النوع عدد صحيح int وبالتالي لايمكن إضافة حرف

ولكن بالإمكان التحايل على هذه المسألة بأن العمود الأول من نوع رمز وتجعل القيمة الافتراضية له هي حرف وليكن S

والعمود الثاني من نوع int وتجعل زيادته تلقائية

ثم تجعل العمودين مع بعضهما أي تحددهما وتجعلمها مفتاح

وهكذا تفعل بالنسبة للجداول التالية بحيث يكون لكل جدول قيمة افتراضية مختلفة لعمود الحرف

وفي هذه الحالة عند حشر أسطر كل جدول خلف أسطر الجدول الرئيسي وحتى لو تكررت الأرقام التلقائية إلا أن عمود الحرف مختلف لكل منهم

ولكن هذه العملية لن تنفعك لأنه عند نسخ أسطر من جدول إلى الجدول الرئيسي لن ينسخ الأرقام الأصلية وإنما سيتابع الترقيم للجدول الرئيسي

لهذا يجب التفكير بحل مختلف ويوجد لي فكرة ولكن أريد أن أتأكد من نجاحها ثم أخبرك عنها

أما عن SQL Query للقيام بعملية النقل من الجداول إلى الجدول الرئيسي فبإمكانك أن تجتهد فيها أو تبحث عن مثال جاهز لتطبيقه

تم تعديل هذه المشاركة بواسطة أبو أحمد المبرمج في 8 ديسمبر 2012 في 14:19

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#6

السلام عليكم ورحمة الله وبركاته

المشكلة التى تعانيها هى مشكلة تصميم قواعد بيانات منذ البداية أو أن العميل غير رأيه وطلب دمج البيانات المستقلة على كل جهاز إلى جهاز واحد

نحاول معاً حل هذه المشكلة وأدعو الله أن يكون أسلوبي مفهوما لأن هذا الحل به التفاتات وتحايلات لضبط الحقول المفتاحية مع الحقول الفرعية المرتبطة بها

الفكرة

سنقوم بالاستعلام عن البيانات من كل سيرفى على حده ووضعها في جدول مؤقت أو (إذا كنت ستستخدم كود السى شارب تضعها في DataTable) ثم تقوم بقراءة السجلات واحداً تلو الآخر عن طريق حلقات التكرات ثم وضعها فى جدولين آخرين نهائيين بحيث نقرأ كل سجل في الجدول الأساسى ونحتفظ بالمفتاح القديم ثم نضيفه فى الجدول النهائى والاحتفاظ بالمفتاح الأساسى الجديد (لاحظ عندنا الآن مفتاحان أساسيان قديم وجديد) وبعد ذلك نستخرج من الجدول الفرعى كل السجلات المرتبطة بالمفتاح الأساسي القديم وقبل أن نضيفها فى الجدول الفرعى النهائي لابد من تحويل المفتاح الفرعى القديم ليشير إلى المفتاح الأساسى الجديد

اممممممممممممم

الكلام توهكم!!!!!

نأخذ مثالاً بأسماء الجداول

عندنا 3 سيرفر 1 و 2 و3

وكل سيرفر عليه جدولين جدول الفواتير وجدول عناصر الفواتير

الجدول الأول أساسى وبه خمس فواتير على كل سيرفر كلها تبدأ برقم 1 وتنتهى برقم 5 (لاحظ أن هذه هى المشكلة ألا وهو تكرار المفاتيح الأساسية على كل سيرفر لذلك لا يمكن إضافتها بهذا الشكل وإلا ستضيع كل العلاقات)

الجدول الثاني به 15 سجل بواقع 3 سجلات مرتبطة بكل سجل أساسى فى جدول الفواتير وتبدأ بالأرقام من 1 إلى 15

نبدأ العمل على السيرفر الأول

نقرأ كل السجلات التى عليه من الجدولين

ثم نبدأ بعمل حلقة تكرارية على الجدول الأساسى ليقرأ السجلات واحدا واحدا

وفي كل مرة يقرأ فيها السجل نحتفظ بالمفتاح الأساسى القديم وليكن رقم 1 ثم نضيف هذا السجل فى الجدول النهائى ونقرأ المقتاح الأساسى الجديد الذي أخذه وليكن 7

ماذا بعد ذلك؟ نحن نريد قراءة كل السجلات (من الجدول الفرعى) المرتبطة بالفتاح القديم 1 ثم تعديل هذا المفتاح الفرعى ليشير إلى الرقم الجديد 7

ثم نقوم بتخزينها فى جدول عناصر الفواتير النهائى بالتعديل الجديد

ونكرر هذه العملية مع السيرفر الثانى والثالث

أدعو الله أن تكون الفكرة واضحة

وتطبيقها فى السى شارب (التى ستسخدم فيها DataTAble & Dataview) سيكون أكثر مرونة من تطبيقها بأكواد السيكوال سيرفر التى ستحتاج فيها إلى (Cursor)

أدعو الله أن تصل الفكرة وأن تكون مفيدة

3

أدعو الله أن يجعل أعمالنا خالصة لوجهه الكريم --- وأن ينفعنا بما علمنا

Dr Sayed Tohamy

Programming Instructor

مدرب برمجة

---------------

EmaSoft2000

-------------------

#7

اعتقد لو العلاقات مضبوطة علي casced apdate في كل الجداول يكون المشكله اتحلت

اولا ناخذ نسخه من كل قواعد البيانات ونناكد من كل العلاقات في كل الجداول والغا auto incrment

ثانيا تحميل كل قواعد البيانات في جهاز واحد علي السكول سيكون عندا ق1-ق2-ق3-ق4 علي نفس الخادم

ثالثا عمل ماقاله ابو احمد في المشاركة الثالثة

رابعا اسخدام برامج اسمه sqldelta للدمج

#8

أشكر كل من رد على ااستفساري وتجاوب معي

أخي ema 2000 t هل من الممكن توضح أكثر مع العلم بأن نفس قاعدة البيانات موجودة على 3 أجهزة مستقلة ليست متصلة بالسيرفر, وأخرى موجودة على السيرفر

#9
asiri6 كتب:

أشكر كل من رد على ااستفساري وتجاوب معي

أخي ema 2000 t هل من الممكن توضح أكثر مع العلم بأن نفس قاعدة البيانات موجودة على 3 أجهزة مستقلة ليست متصلة بالسيرفر, وأخرى موجودة على السيرفر

السلام عليكم ورحمة الله وبركاته

أخى المبارك

أعلم أن الموضوع يصعب شرحه كتابة، ولكن أحاول إيجاد حل وفى نفس الوقت يسهل شرحه كتابةً

حاول الطريقة التالية

مع العلم بأننى أفترض أنك تستطيع الوصول إلى جميع السيرفرات ولك فيها كافة الصلاحيات

أرجو قرءاة الموضوع إلى نهايته قبل تنفيذ أى خطوة ويفضل قراءته عدة مرات

بداية: الحل يعتمد بإذن الله على ربط الجدوال بأعمدة أخرى غير المفاتيح الأساسية حتى إذا تغيرت لا تضيع العلاقات بين الجدوال ويمكننا ضبطها بعد ذلك

الخطوات

1- يجب عليك إضافة عمود نوعه حرفى nvarcvhar(20) فى كل الجداول المرتبطة ببعضها وذلك فى كل السيرفرات بما فيها السيرفر الرئيسى (الهدف)

2- ستضع قيمة فى هذا العمود عبارة عن رقم المفتاح الأساسى + حرف يمثل السيرفر

على سبيل المثال

لو عندنا جدول العملاء وجدول الفواتير المرتبطين ببعضهما

نقوم بزيادة عمود فى كلا الجدولين ونجعل قيمته تساوى المفتاح الأساسى + حرف ثابت لكل سيرفر

ويمكنك تنفيذ هذا الأمر باستخدام أمر update كالتالى

update customers set NewColumn = str(Customer_ID) + 'a' -- for first server

update customers set NewColumn = str(Customer_ID) + 'b' -- for second server

وكذلك قم بالتعديل فى الجدول الفرعى

update Ordersset NewColumn = str(Customer_ID) + 'a' -- for first server

update Ordersset NewColumn = str(Customer_ID) + 'a' -- for second server

3- فى هذه الخطوة تقوم بنسخ قواعد البيانات من السيرفرات الفرعية ووضعها فى السيرفر الرئيسى (بافتراض أنك تستطيع الوصول لهذه السيرفرات وتقوم بهذه العملية يدوياً عن طريق إيقاف قواعد البيانات TakeOff line ) ثم نسخ ملفات القاعدة إلى السيرفر الرئيسى ثم عمل اتصال (attach)

ملحوظة هامة: ربما تحتاج إلى تسمية قواعد البيانات قبل فصلها من أى سيرفر حتى لا يحدث تناقض عندما تقوم بنسخهم على السيرفر الرئيسى

فمثلاً سمى القاعدة على السيرفر الأول بإضافة رقم واحد إلى إسمها db1 وعلى السيرفر الثانى db2 وهكذا ثم قم بعملية الإيقاف والنسخ

حتى هذه الخطوة يجب أن يكون السيرفر الرئيسى عندك يحتوى على جميع قواعد البيانات المجمعة من كل السيرفرات

4- تقوم بعملية إدراج البيانات من الجدوال الفرعية فى قواعد البيانات المجمعة من السيرفرات الفرعية إلى قاعدة البيانات الرئيسة وذلك باستخدام أمر

Insert into Customers (col1, col2, col3,...) select col1, col2, col3,... from db1..Customers

وتنفيذ الأمر على قاعدة البيانات الثانية

Insert into Customers (col1, col2, col3,...) select col1, col2, col3,... from db2..Customers

ولاحظ أنك لا تكتب اسم المفاتيح الأساسية فى جملة insert

وقم بتنفيذ نفس الأمر على باقى الجداول

5 - الآن لديك البيانات مجمعة على قاعدة بيانات واحدة والجدوال فيها مرتبطة بالعمود الجديد الذى أضفناها قبل فصل قواعد البيانات

ما عليك الآن سوى إعادة ربط كل الجدوال بالمفاتيح الأساسية ويتم ذلك بأمر update ولكن على الجداول الفرعية فقط

update orders set CustomerID = (select CustomerID from Customers where Customers.NewCol = Orders.NewCol) as Customers

6- قم بحذف العمود الذى أضفناه من كل الجداول فتحصل على قاعدة بيانات سليمة بإذن الله

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

أدعو الله بالتوفيق

فى حالة وجود استفسارات حاولة محادثتى تليفونياً 01006424393

5

أدعو الله أن يجعل أعمالنا خالصة لوجهه الكريم --- وأن ينفعنا بما علمنا

Dr Sayed Tohamy

Programming Instructor

مدرب برمجة

---------------

EmaSoft2000

-------------------

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…