PDA

View Full Version : عدم حذف داده در صورت وجود در جدول دیگر



kastakoorta
پنج شنبه 31 فروردین 1391, 11:46 صبح
با سلام .
میخواستم بدونم برای اینکه اگر یه فیلدی مقدارش در جدول دیگه به عنوان مرجع استفاده شده باشه نزاره حذف بشه باید چیکار کرد . بانکم هم MSSQL هست .
مثال
کد شهر نام شهر
1 تهران
2 مشهد
3 اصفهان

جدول کاربران
نام نام خانوادگی کدشهر
علی رضایی 1
محمد ثنایی 2

حالا در صورتی که بخواهیم هر یک از شهرها رو حذف کنیم ، در صورتی که در جدول کاربران موجود بود نزاره حذف بشه تا اونا حذف نشدن !

ahmad156
پنج شنبه 31 فروردین 1391, 11:50 صبح
توی تعریف DataBase موقع تعریف کلید خارجی گزینه Update Cascade و Delete Cascade برای همین کاره

kastakoorta
پنج شنبه 31 فروردین 1391, 12:04 عصر
میشه بیشتر توضیح بدید . یه مثال بزنید ممنون میشم .

ahmad156
پنج شنبه 31 فروردین 1391, 12:16 عصر
دوست عزیز
شما وقتی کلید خارجی تعریف میکنین گزینه های بالا رو هم دارین که به این معنی هست که اگر شهر 1 حذف شد تمام رکوردهایی که کلید خارجی اونها شهر 1 هست همه اون رکورد ها هم حذف میشه و اگر Update شد نیز به همین روال.اگر تیک این گزینه ها رو نزنین با حذف یا update هیچ اتفاقی در رکوردهایی که کلید خارجی اونها رکورد های تغییر یافته یا حذف شده هست ایجاد نمیشه

kastakoorta
پنج شنبه 31 فروردین 1391, 12:33 عصر
بسیار عالی ، حالا میشه بگید چطور میتونم خطاهایی که از SQL برای این مورد صادر میشه رو کنترل کنم و به کاربر نشون بدم ؟
یا باید خودم هم یک بار چک کنم ببینم اطلاعات در جدول دیگه موجوده و به کاربر نشون بدم ؟

ahmad156
پنج شنبه 31 فروردین 1391, 12:35 عصر
یه راهش همینه دقیقا

dorparasti
پنج شنبه 31 فروردین 1391, 13:11 عصر
فک کنم منظور دوستمون این بود که اگر در جدول های دیگه به عنوان کلید خارجی به رکورد اصلی ارجاع شده مانع از حذف خود اون رکورد اصلی بشن . ( نه اینکه با حذف رکورد اصلی رکوردهای مرتبط در دیگر جداول حذف بشن ) .

چیزی که الان به ذهنم می یاد اینه که در خود query یا در قالب یک تریگر اول با یک شرط if وجود داشتن اون رکورد به عنوان FK در جداول وابسته رو چک کنید و بر اساس اون تصمیم بگیرید

kastakoorta
پنج شنبه 31 فروردین 1391, 13:12 عصر
آره . ولی این کار به کدنویسی زیادی احتیاج داره و خیلی زمان بره .
مثلا من یه جدول دارم به نام استان که کد استان در تمام جداولم برای تفکیک اطلاعات به صورت کشوری ذخیره شده .
حالا اگه 20 تا جدول رو چک کنم خیلی زمان بر هست .
آیا روش بهتری وجود داره ؟

dorparasti
پنج شنبه 31 فروردین 1391, 13:33 عصر
من تخصصی در دیتابیس ندارم . اما یک راه هم همونه که دوستمون گفتن یعنی تنظیم وضعیت رکوردها در زمان بروز رسانی و حذف رکورد اصلی . اگر نوع casecade رو انتخاب کنید که همونطور که گفتن با حذف رکورد اصلی رکوردهای وابسته هم حذف ( بروز ) می شن . اما اگه نوع NoAction رو انتخاب کنید اونوقت دیگه تا وقتی که یک رکورد در جداول دیگه FK شده باشه نمی شه حذفش کرد و یکسری محدودیت های دیگه

+ مطلب اصلی (http://msdn.microsoft.com/en-us/library/aa902684%28v=sql.80%29.aspx)

kastakoorta
پنج شنبه 31 فروردین 1391, 14:53 عصر
موضوعی رو که شما گفتید رو گرفتم ، حالا میخوام بدون چطور در ASP.net کنترلش کنم ، یه خطای مناسب به کاربر نشون بدم بدون اینکه خودم دستی چک کنم ؟

Alghoochi
پنج شنبه 31 فروردین 1391, 22:51 عصر
موضوعی رو که شما گفتید رو گرفتم ، حالا میخوام بدون چطور در ASP.net کنترلش کنم ، یه خطای مناسب به کاربر نشون بدم بدون اینکه خودم دستی چک کنم ؟

می‌تونی همون خاصیت Delete رو روی SetByDefault قرار بدی تا با مقدار پیش‌فرض پر بشه. توی کدهای سمت سرورت هم چک کن مقدر فیلد با مقدار پیش‌فرض پر شده یا نه.

kastakoorta
جمعه 01 اردیبهشت 1391, 00:34 صبح
میشه یه مثال بزنید ؟
ممنو

kastakoorta
شنبه 02 اردیبهشت 1391, 00:36 صبح
دوستان یعنی هیچ راهی وجود ندارده که بشه بدون کد دسترسی این رخداد رو کنترل کرد ؟