PDA

View Full Version : مشکل Cascade داده ها در روش حذف و بروزرسانی منطقی (Logical Delete or Soft Delete)



emad4000
دوشنبه 05 خرداد 1393, 14:22 عصر
با سلام به همه دوستان
من توی یکی از برنامه هام، از روش حذف منطقی (Logical Delete or Soft Delete) استفاده می کنم
بالطبع برای بروزرسانی داده ها هم از بروزرسانی منطقی استفاده می کنم
ولی مشکلی که برام پیش میاد توی Cascade کردن اطلاعات تغییر یافته است.

مثلاً در جدول Person شخصی دارم با شماره 1
شماره این شخص در جدول قراردادها به صورت کلید خارجی استفاده شده، یعنی مثلاً قراردادی برای این شخص (که شماره اش 1 هست) ثبت شده.

حالا من اگر اطلاعات این شخص رو بخوام تغییر بدم، مثلاً فامیلش عوض بشه، اول میام فیلد isDeleted رکورد قبلی شخص رو True می کنم، بعد میام رکوردی در جدول Person می سازم که دقیقا یه کپی از رکورد قبلیش هست، فقط فامیلش فرق می کنه. از اونجایی که شماره شخص کلید اصلی جدول هست، شماره اش هم عوض میشه و مثلاً میشه 2
اینجاست که مشکل بوجود میاد. حالا دیگه اون قرارداد که برای فرد شماره 1 ثبت شده بود دیگه معتبر نیست
در واقع باید شماره شخص در این جدول هم Cascade بشه و بشه 2

برای این کار ایده هایی مثل جدا کردن کلید اصلی در جدول دوم یا نوشتن روال خودکار Cascade دارم. ولی اول می خوام بدونم آیا روش استانداردی برای این مشکل وجود داره یا نه؟

emad4000
یک شنبه 25 خرداد 1393, 11:44 صبح
کسی نمی تونه یه راهنمایی کنه؟؟؟؟!!!!؟؟

espootin
یک شنبه 25 خرداد 1393, 12:02 عصر
سلام

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

emad4000
دوشنبه 26 خرداد 1393, 13:26 عصر
از نظر من ، نیازی به این کار نیست ،‌ شما برای تغییر فقط ردیف مربوطه را ویرایش کن. در صورتی که اطلاعات شخص از سمت کاربر حذف شد ،‌ از حذف منطقی استفاده کن.
با این روش مشکلی نخواهید داشت .
اگر من منظور شما را بدرستی متوجه نشدم ،‌بیشتر توضیح بدین لطفا.

خوب من اين كار رو انجام ميدم كه سابقه ويرايش داده ها رو حفظ كنم. يعني بعداً با رجوع به تاريخچه اون ركورد، ببينم كه قبلاً چه داده اي داشته
بنابراين نياز دارم كه اينجوري عمل كنم

عالیه.م
دوشنبه 02 تیر 1393, 20:43 عصر
خوب من اين كار رو انجام ميدم كه سابقه ويرايش داده ها رو حفظ كنم. يعني بعداً با رجوع به تاريخچه اون ركورد، ببينم كه قبلاً چه داده اي داشته
بنابراين نياز دارم كه اينجوري عمل كنم

سلام.
راهی که من برای پاسخ به سوال شما (البته اگه سوال شما رو درست متوجه شده باشم) انتخاب میکنم، اینه که یه کپی از رکورد شماره 1 تو جدول personدرست کنم. بعدش همون رکورد شماره 1 رو ویرایش کنم. به جای فیلد isdeleted هم یه فیلد PreviousID در نظر میگیرم که در حالت عادی نال هست. وقتی رکوردی دیلیت میشه -1 و وقتی ویرایش میشه، شماره رکورد ثبت شده جدید (که اطلاعات قبلی توش ثبته) اونجا قرار میگیره. با این روش دیگه نیازی به تغییر جدول قراردادها نخواهد بود.

مهدی هادیان2
سه شنبه 03 تیر 1393, 14:38 عصر
بسم الله الرحمن الرحیم

با سلام به همه دوستان
من توی یکی از برنامه هام، از روش حذف منطقی (Logical Delete or Soft Delete) استفاده می کنم
بالطبع برای بروزرسانی داده ها هم از بروزرسانی منطقی استفاده می کنم
ولی مشکلی که برام پیش میاد توی Cascade کردن اطلاعات تغییر یافته است.

مثلاً در جدول Person شخصی دارم با شماره 1
شماره این شخص در جدول قراردادها به صورت کلید خارجی استفاده شده، یعنی مثلاً قراردادی برای این شخص (که شماره اش 1 هست) ثبت شده.

حالا من اگر اطلاعات این شخص رو بخوام تغییر بدم، مثلاً فامیلش عوض بشه، اول میام فیلد isDeleted رکورد قبلی شخص رو True می کنم، بعد میام رکوردی در جدول Person می سازم که دقیقا یه کپی از رکورد قبلیش هست، فقط فامیلش فرق می کنه. از اونجایی که شماره شخص کلید اصلی جدول هست، شماره اش هم عوض میشه و مثلاً میشه 2
اینجاست که مشکل بوجود میاد. حالا دیگه اون قرارداد که برای فرد شماره 1 ثبت شده بود دیگه معتبر نیست
در واقع باید شماره شخص در این جدول هم Cascade بشه و بشه 2

برای این کار ایده هایی مثل جدا کردن کلید اصلی در جدول دوم یا نوشتن روال خودکار Cascade دارم. ولی اول می خوام بدونم آیا روش استانداردی برای این مشکل وجود داره یا نه؟
با سلام
لطفا برای موردی که فرمودید راجع به CDC که مخفف Change Data Capture هست تحقیق بفرمائید.
موفق باشید.