PDA

View Full Version : چگونگی استفاده از delet



بیتافرهی
یک شنبه 27 مرداد 1387, 08:13 صبح
سلام دوستان
من سه تا جدول دارم ،که این سه تا از طریق کلید خارجی به هم مرتبطند.من می خوام وقتی تو فرم اول یک رکورداضافه کردم در بقیه هم اضافه شود .همچنین در مورد حذف.وقتی از جدول اولم حذف می کنم پیغام خطا می دهد.که وابستگی وجود دارد و برنامه قفل می شود.در مورد delete چه exception ای را اضافه کنم؟
در مورد add چه کار کنم تا بتوانم همزمان add کنم؟

رضا جاسبی
یک شنبه 27 مرداد 1387, 11:04 صبح
در مورد Delete باید مدل Delete رو Cascade انتخاب کنی. تو همون صفحه ای که Relation رو تعریف می کنی یک CheckBox داره که Cascade می کنه. برای Update و Delete میشه Cascade گذاشت. اینطوری از جدول اصلی که حذف بشه از جدول تابع هم حذف می شه. اما به نظر من بهتره که کنترل حذف رو خودت داشته باشی. گاهی هم ارتباط بین جدول اصلی و تابع ارتباط محکم نیست. یعنی ممکنه در جدول اصلی رکوردی داشته باشی که در جدول تابع نباشه. و یا اینکه محکم باشه که در این صورت با حذف آخرین رکورد تابعه باید رکورد اصلی هم حذف بشه. این بستگی به طراحی و نیاز سیستم داره.
در مورد Add هم تا جایی که من می دونم خود SQL چنین کاری نمی کنه. چاره یا Storde Procedure هست یا Trigger. اما باز هم Add در جدول تابع چی باید Add کنه؟ اگر مقادیر تعریف شده هستند از همون Trigger یا Stored Procedure که گفتم استفاده کن.

بیتافرهی
دوشنبه 28 مرداد 1387, 18:58 عصر
اگر cascade بگذارم،دیگه محدودیتی از نظر اینکه اول از کدام جدول بخواهم حذف کنم ندارم؟



اما به نظر من بهتره که کنترل حذف رو خودت داشته باشی. گاهی هم ارتباط بین جدول اصلی و تابع ارتباط محکم نیست. یعنی ممکنه در جدول اصلی رکوردی داشته باشی که در جدول تابع نباشه. و یا اینکه محکم باشه که در این صورت با حذف آخرین رکورد تابعه باید رکورد اصلی هم حذف بشه

پس اگه اینطوره cascade به چه دردی می خوره؟

رضا جاسبی
سه شنبه 29 مرداد 1387, 00:00 صبح
دوست من در Cascade به دیتابیس میگی که اگر از جدول اصلی سطری حذف کردی از جدول تابع هم حذف کن. اما اگر از جدول تابع حذف کنه از اصلی حذف نمیشه. محدودیت ترتیب حذف برداشته نمیشه (یا به عبارتی "محدودیت" برداشته میشه ولی مفهوم ترتیب وجود داره) بلکه اگر اول بخواهی رکورد اصلی رو حذف کنی دیتابیس بهت error نمی ده بلکه کار انجام نداده ات رو کامل میکنه. اما اینطور نیست که هیچ تفاوتی نباشه. حداقل یک تفاوت هم اینه که با حذف رکوردهای تابع (حتی تمام اونها) سطر اصلی پاک نمیشه اما با حذف سطر اصلی (به شرط فعال بودن Cascade) سطرهای تابع حذف می شود.
اینکه گفتم خودت کنترل کنی در برنامه معنا داره. مثلا به کاربر پیغام بدی که اطلاعات تابع داری و مثلا سوال که "آیا سطرهای تابع هم حذف شوند؟" که با جواب مثبت کاربر می تونی حذف رو انجام بدی. این بستگی به برنامه و طراحی شما داره. یک مورد دیگه هم اینکه اگر شما خودت کنترل کنی می تونی بعد از حذف آخرین سطر تابع ، سطر اصلی رو هم حذف کنی. البته اگر جدول اصلی طبق تعریف و طراحی شما در رابطه "محکم" باشه یعنی حتما باید در رابطه با جدول تابع شرکت کنه. مثالش می تونه کارمند باشه که در رابطه استخدام حتما باید شرکت کنه. یعنی کارمندی نداریم که در دپارتمانی نباشه. البته این هم به طراحی و نیاز شما بستگی داره و ممکنه چنین کارمند بدون دپارتمانی داشته باشید. اما با Cascade این کار انجام نمیشه و شما باز هم باید خودت در برنامه رکورد اصلی رو حذف کنی.
cascade درواقع همانطور که گفتم کار جا افتاده شما رو انجام میده یعنی قبل از حذف سطر اصلی اطلاعات مربوطه در جدول تابع رو حذف می کنه.