PDA

View Full Version : سوال: مقایسه و همگام سازی بانک اطلاعاتی (DataBase)



JaVaD_1900
دوشنبه 19 فروردین 1392, 18:15 عصر
همگام سازی پایگاه داده ها امکانی است که به شما تصویر کاملی از تفاوت های پایگاه های داده را می دهد. زمانی که دیتابیس ها مقایسه شدند، شما می توانید تفاوت ها را مشاهده کرده و اسکریپت همگام سازی لازم را برای به روز رسانی دیتابیس مقصد بسازید.

سورسی که این کار رو انجام بده رو میشه نوشت؟
میخوام این کار رو از داخل نرم افزار انجام بدم

tooraj_azizi_1035
سه شنبه 20 فروردین 1392, 11:48 صبح
سلام
اگر می خواهید این همگام سازی رو به قصد هماهنگ کردن کلاینت و سرور انجام دهید یعنی کلاینت به شکل Offline به کارش ادامه بده و اطلاعاتش رو روی یک دیتابیس local ذخیره کنه و در موقع لازم با سرور هماهنگ بشه می تونید از Occasionally connected apps رو بخونید:
Occasionally Connected Applications (Local Database Caching) (http://msdn.microsoft.com/en-us/library/vstudio/bb384436%28v=vs.100%29.aspx)

JaVaD_1900
سه شنبه 20 فروردین 1392, 15:02 عصر
نه منظورم این نیس،
ببینی من یه نرم افزار دارم که هر روز آپ دیت میشه و ورژن های جدید میدیم.
اما بعضا تغییرات تو سورس نیس و باعث میشه تو دیتا بیس هم تغییراتی انجام بدیم
خب واسه کاربر راحته که فایل اجرایی یا dll ها رو آپ دیت کنه، فوقش یه جایگزین میکنه تمام، اما بانک اطلاعاتی رو چی؟ نمیتونه که خودش فیلد اضافه کنه
اسکریپت آخرین نسخه بانک رو هم رو آخرین فایل اجرایی میزارم اما اون ایجاد میکنه نه همگام سازی، حال نمیدونم چه کنم که با اسکریپت یا خود دیتا بیس بتونم اون بانکی که تو سیستم کاربر هس رو به روز کنم.
اصلا به اطلاعات کاری ندارم، اطلاعات باید حفظ بشه، فقط ساختار رو به روز میکنیم

parand60
سه شنبه 20 فروردین 1392, 16:05 عصر
راه ساده اما نه چندان حرفه ایش که خیلی جاها به کار میره اینه که اسکریپت هر تغییری که روی بانک میدی رو در اختیار کاربر بذاری تا اونا هم اسکریپت (ها) رو روی بانکشون اجرا کنند. اینجوری دیتای بانکشون هم حفظ میشه

tooraj_azizi_1035
سه شنبه 20 فروردین 1392, 16:22 عصر
اینجا رو دیدی:http://www.sqldelta.com/

aliasghar2
سه شنبه 20 فروردین 1392, 16:25 عصر
سلام
من این کار رو کردم اما نمی توانم سورس ان را در اختیارت بزارم اما می تونم مراحل رو بهت بگم

برای این کار باد دو نه دونه تمام جداول و فیلد های هر دوبانک رو از نظر ساختاری با هم مقایسه کنی و در صورت هر گونه تفاوت تغییرات رو بدی البته این مقایسه از نظر ساختاری هست نه اطلاعاتی
در ضمن نرم افزار های شبیه این هم هست که می تونی ازش ایده بگیری
موفق باشی

JaVaD_1900
سه شنبه 20 فروردین 1392, 17:00 عصر
ممنون، نرم افزار شبیه این مثل چی؟
دونه دونه جدول ها و فیلد ها رو خودم دستی کد بنویسم مقایسه کنم؟ یه برنامه خیلی بزرگ میخواد، نمیشه به این راحتی!
باید تبدیل به xml کنم و بعد مقایسه، تازه اصلا گیرم که کردم و تفاوت ها پیدا شد، باید یه اسکریپت ساز بنویسم که تفاوت های در اومده رو تبدیل به اسکریپت sql کنه و بعد اون رو اجرا کنم!

sqldelta خوبه اما چطور میتونم یه چنین چیزی رو برنامم داشته باشم!!!

aliasghar2
سه شنبه 20 فروردین 1392, 18:53 عصر
دونه دونه جدول ها و فیلد ها رو خودم دستی کد بنویسم مقایسه کنم؟ یه برنامه خیلی بزرگ میخواد، نمیشه به این راحتی!
نه دوست عزیز
اصلا بیا مراحل رو ریز تر بررسی کنیم
1 نیاز به تابعی داریم که دوتا بانک رو به عنوان بانک مبدا و بان مقصد بگیره
2 لیست جداول بانک مبدا رو بدست بیاریم به روش زیر
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA='dbName'


3 . حالا با یه حلقه به ازای جدول هامون شروع می کنیم چک کردن که ایا این جدول در بانک مقصد وجود دارد اگر نداشت ان جدول رو در بانک مقصد ایجاد می کنیم
4 .اگر جدول در بانک مقصد بود فیلد های جدول مبدا را بدست می اوریم
5 حالا با یه حلقه دیگه شروع می کنیم به چک کردن اختلاف فیلدها

اگه توی این مراحل مشکلی داشتی دوباره پست بذار
موفق باشی

حمیدرضاصادقیان
سه شنبه 20 فروردین 1392, 22:23 عصر
سلام
میتونید از منوی View-SQL Server Object Explorer به اون دسترسی پیدا کنید.
در اینجا میتونید از Schema های دیتابیسهای مختلف یک Compare بگیرید و تفاوتها رو بدست بیارید و Script اونو در هرجایی که میخواهید اجرا کنید و نیازی به استفاده از ابزار اضافی نمی باشد.

JaVaD_1900
سه شنبه 20 فروردین 1392, 22:55 عصر
5 حالا با یه حلقه دیگه شروع می کنیم به چک کردن اختلاف فیلدها

چجوری اطلاعات فیلد ها رو به دست بیارم؟

راستی به نظرت این روش بهتره یه روشی که بانک جدید بسازم و اطلاعات رو به بانک جدید اضافه کنم بهتره؟
البته تقریبا کد هاشون شبیه میشه! اما کار سختی هس

aliasghar2
چهارشنبه 21 فروردین 1392, 07:58 صبح
چجوری اطلاعات فیلد ها رو به دست بیارم؟ اینجوری
select column_name,* from information_schema.columns
where table_name = 'YourTableName'


راستی به نظرت این روش بهتره یه روشی که بانک جدید بسازم و اطلاعات رو به بانک جدید اضافه کنم بهتره؟
البته تقریبا کد هاشون شبیه میشه! اما کار سختی هس
روش بدی نیست چون یک سری مراحل رو حذف می کنه ولی این درست نیست که هر سری یک بانک جدید ایجاد کنی

aliasghar2
چهارشنبه 21 فروردین 1392, 08:10 صبح
اگه می خوای این روش مقایسه بانک رو تجربه کنی و عملا کد خاص خودت رو داشته باشی بهتره که همین روش رو ادامه بدی

ولی اگه زمان برات مهمه و می خوای به نتیجه مطلوب برسی می تونی به این روش عمل کنی که با استفاده از نرم افزار مثل همون sqlDelta بانکت رو مقایسه کنی این نرم افزار ها یک فایل script رو بر می گردونن مرحله بعدی ساخت یک exe کوچولو که این اسکریپت رو در سیستم کار بر اجرا میکنه

parand60
چهارشنبه 21 فروردین 1392, 08:28 صبح
سلام
میتونید از منوی View-SQL Server Object Explorer به اون دسترسی پیدا کنید.
در اینجا میتونید از Schema های دیتابیسهای مختلف یک Compare بگیرید و تفاوتها رو بدست بیارید و Script اونو در هرجایی که میخواهید اجرا کنید و نیازی به استفاده از ابزار اضافی نمی باشد.

ببخشید برای من یه سوال پیش اومد. در منوی view یه Object Explorer هست و یه Object Eplorer details ، اما من متوجه نشدم چطوری اینجا میتونم compare بگیرم. میشه یکمی توضیح بدین

حمیدرضاصادقیان
چهارشنبه 21 فروردین 1392, 11:23 صبح
من این منو رو در نسخه VS 2012 دیدم و باهاش کار کردم. وقتی بازش کنید میتونید به Engine های مختلف متصل شده و یک Schema Compare داره که میتونید از اون استفاده کنید و واقعا نیازی به این همه پیچیدگی که دوستان اشاره کردن نیست.!!
اگر از ابزار هم میخواهید استفاده کنید میتونید از redgate استفاده کنید.

JaVaD_1900
پنج شنبه 22 فروردین 1392, 10:22 صبح
اگه می خوای این روش مقایسه بانک رو تجربه کنی و عملا کد خاص خودت رو داشته باشی بهتره که همین روش رو ادامه بدی
این خیلی خوبه اما واقعا زمان بر هس، الان اونقدر گیرم که موندم اصلا چیکار کنم
فقط حالا تفاوت ها رو پیدا کردیم، چطوری اسکریپت به روز رسانی تولید کنیم؟

کامپوننت کرک شده redgate رو میشه گیر آورد، این خودش عالی هس ولی من پیداش نکردم، اگه بود خیلی عالی بود خودش.

Schema Compare تو همه ویژوال استادیوها هس فقط باید نسخه Ultimate نصب بشه، تو نسخه های دیگه نیس، اگه نصب کنین تو همون منوی Data اولین گذینه هس

linux
پنج شنبه 22 فروردین 1392, 11:01 صبح
نه منظورم این نیس،
ببینی من یه نرم افزار دارم که هر روز آپ دیت میشه و ورژن های جدید میدیم.
اما بعضا تغییرات تو سورس نیس و باعث میشه تو دیتا بیس هم تغییراتی انجام بدیم
خب واسه کاربر راحته که فایل اجرایی یا dll ها رو آپ دیت کنه، فوقش یه جایگزین میکنه تمام، اما بانک اطلاعاتی رو چی؟ نمیتونه که خودش فیلد اضافه کنه
اسکریپت آخرین نسخه بانک رو هم رو آخرین فایل اجرایی میزارم اما اون ایجاد میکنه نه همگام سازی، حال نمیدونم چه کنم که با اسکریپت یا خود دیتا بیس بتونم اون بانکی که تو سیستم کاربر هس رو به روز کنم.
اصلا به اطلاعات کاری ندارم، اطلاعات باید حفظ بشه، فقط ساختار رو به روز میکنیم
این دیگر چطور طراحی هست که شما دارید. وقتی یک برنامه نوشته می‌شه تجزیه و تحلیل شده مگر الکی هست طرف شب بخوابه صبح بیدار بشه ببین فیلد جدید اضافه شده؟

JaVaD_1900
پنج شنبه 22 فروردین 1392, 11:58 صبح
این دیگر چطور طراحی هست که شما دارید. وقتی یک برنامه نوشته می‌شه تجزیه و تحلیل شده مگر الکی هست طرف شب بخوابه صبح بیدار بشه ببین فیلد جدید اضافه شده؟

چرا میزنی مهندس؟ :)

فرض کن یه نرم افزار عمومی مثل حسابداری نوشتی، الان هم چند تا فروختی، حالا فهمیدی که مثلا واسه جدول مشتری ها یه فیلد رو پیش بینی نکردی، یا یه امکان جدید که نیاز به جدول داره به برنامت اضافه کردی، و نیاز به به روز رسانی برنامه هس! پس باید اینجا یه کنترلی باشه که بانک اطلاعاتی هم بروز بشه

linux
پنج شنبه 22 فروردین 1392, 23:57 عصر
چرا میزنی مهندس؟ :)

فرض کن یه نرم افزار عمومی مثل حسابداری نوشتی، الان هم چند تا فروختی، حالا فهمیدی که مثلا واسه جدول مشتری ها یه فیلد رو پیش بینی نکردی، یا یه امکان جدید که نیاز به جدول داره به برنامت اضافه کردی، و نیاز به به روز رسانی برنامه هس! پس باید اینجا یه کنترلی باشه که بانک اطلاعاتی هم بروز بشه
خوب این را که از روز اول هم میدونی طوری طراحی می‌کنی که کاربر بتون فیلد داینامیک اضافه کنه در قسمت sqlserver نگاه کن بحث شده.
حالا فرض فیلد جدید اضافه کردی خوب این دیتا را مگر نباید کاربر ایجاد کنه شما دیتا از کجا می‌یاری؟

JaVaD_1900
جمعه 23 فروردین 1392, 01:16 صبح
اون فیلد داینامیک قسمت sqlserver که من دیدم به طراحی بانک ربط داره و تحلیل، جبران اشتباه تحلیل سخت تر از این حرفاس!

با دیتاهای قبلی که کاری نداریم، دیتا های جدید (چه فیلد و یا خود جدول) رو کاربر از این به بعد تو ورژن جدید وارد و یا ویرایش میکنه، فرض کنین یه فیلد وب سایت به فرم مشخصات طرف حساب ها اضافه شده، فیلد جدید بعد اضافه شدن کلا Null و یا مقدار Default میگیره، حالا کاربر قبلی ها رو که Null هستن رو ویرایش میتونه بکنه و جدید ها رو هم از این به بعد اگه خواست اطلاعاتش رو پر میکنه، چون همزمان هم فایل اجرایی آپ دیت شد هم بانک اطلاعاتی.


اینجوری
select column_name,* from information_schema.columns
where table_name = 'YourTableName'
روش بدی نیست چون یک سری مراحل رو حذف می کنه ولی این درست نیست که هر سری یک بانک جدید ایجاد کنی

فقط حالا ما این اطلاعات رو در قالب یه DataTable بدست آوردیم، حال دونه دونه فیلد ها رو هم مقایسه کردیم، چجوری واسه اینا اسکریپت بسازیم؟
دونه دونه بزارم تو فرمت Alter و اجرا کنم؟ یا روش بهتری هس؟

FastCode
جمعه 23 فروردین 1392, 01:53 صبح
خیلی جالبه.
اگر کسی از من بپرسه تخصصت چیه؟ دقیقا میگم database synchronization.
ولی سوالتون اینقدر کلی هست که هر چقدر فکر میکنم به این نتیجه میرسم که باید ۳۰ ۴۰ صفحه جواب بدم.

پ.ن.
دعا کن این مشتری ها دست از سرم بردارن تا نسخه 0.1 (MVDB(GPL3 رو آپلود کنم روی github
این مشکل کاملا توش حل شده.به جز تصمیمگیری برای همون بخشی که سوالش توی امضام هست.(موتور تبدیل On-The-Fly برای query های همزمان بین نسخه های مختلف برنامه)
روش انجام شده کاملا backward/forward compatible هست و با ساختار snapshot ی که داره porformance بیشتر از MSSQL رو در استفاده همزمان نسخه های مختلف برنامه بهتون میده.فکر نمیکنم که بتونید(واقعا همت میخواد) در SQL مشابه کار من رو انجام بدید ولی اگر بیشتر پروژتون رو باز کنید میتونم بهتر کمکتون کنم.
هر موقع اولین نسخه قابل استفاده روی github گزاشته بشه لینکش رو به امضام اضافه میکنم.