PDA

View Full Version : مشکل با cascade Delete در sql



MNosouhi
جمعه 26 آبان 1385, 12:01 عصر
وقتی cascade Delete رو تیک زده باشم ، اگر رکوردی از جدول اصلی حذف بشه ، تمام رکورد های وابسته به اون رکورد ، در جداول دیگه هم حذف میشه اگر هم cascade Delete تیک نخورده باشه و وابستگیی بین رکورد جاری و وجداول دیگه وجود داشته باشه اصلا اجازه حذف نمیده . حالا میخام اگر رکوردی از جدول جاری حذف شد که با رکوردهایی در جدول های دیگه رابطه داره ، کلید خارجی رکوردهای جداول دیگه مقدار null بگیرند.
یه مثال میزنم ، یه جدول داریم با نام Table1 که حاوی پست های سازمانی هستش (مثل معاونت ، مدیریت و ...) و یه فیلد داره به اسم Pid که فیلد کلید است . یه جدول دیگه هم داریم که اسمش Table2 هستش و مشخصات افراد مثل نام ، نام خانوادگی و پست سازمانی اشخاص رو نگهداری میکنه . Pid در Table2 به عنوان کلید خارجی استفاده میشه . حالا اگر یک رکورد Table1 حذف بشه منطقی نیست که Sql server بیاد و از Table2 تعدادی رکورد حذف کنه(یعنی به خاطر اینکه یه پست سازمانی حذف شده ، مشخصات همه افرادی را که دارای اون پست سازمانی بودن رو حذف کنه) ، بلکه منطقی اینه که Pid در Table2 رو Null کنه تا بعدا کاربر دوباره مقداردهی کنه(پست جدیدی رو انتخاب کنه
sql میتونه خودش این رو مدیریت کنه و یا اینکه ما خودمون باید مدیریت کنیم؟

m-khorsandi
جمعه 26 آبان 1385, 18:22 عصر
اگه از SQL Server 2005 استفاده میکنی ، میتونی با امکانات جدیدی که داره این مشکل رو حل کنی.
Foreign Key Constraint در قسمت Cascade ، دو تا ویژگی جدید داره به نام SET NULL و SET DEFAULT :
SET NULL در جدول فرزند : اگر رکوردی در جدول پدر حذف بشه، مقدار NULL رو جایگزین میکنه، که در این صورت این فیلد (کلید خارجی) را باید به صورت Allow Null ایجاد کنی.

SET DEFAULT‌ در جدول فرزند : قبل از استفاده باید یه Default Constraint برای اون فیلد تعریف کنی،
و بعد از این ویژگی استفاده کنی، که در این صورت مقدار تعریفی در این Constraint بعد از حذف رکورد در جدول پدر ،جایگزین فیلد مربوطه در جدول فرزند میشه.

MNosouhi
جمعه 26 آبان 1385, 23:49 عصر
از sqlserver 2000 استفاده می کنم.
حالا باید چیکار کنم؟