PDA

View Full Version : سوال: مشکل در Relation



scream666_ss
سه شنبه 30 تیر 1388, 14:33 عصر
سلام دوستان کسی‌ میدونه چه جوری می‌شه یک relation دو جانبه با شرط داشت؟

فرض کنید که ۳ تا جدول داریم.

جدول T۱ با ۳ ستون A و B و State

جدول T۲ با ۲ ستون C و B

و جدول T۳ با ۲ ستون D و B

حال میخواهیم یک Relation ایجاد کنیم که در این Relation ستون B در جدول T۱ هم به ستون B در جدول T۲ و هم به ستون B در جدول T۳ وصل باشه

نکته: ستون B در دو جدول T۲ و T۳ کلید اصلی‌ و در جدول T۱ کلید خارجی‌ است

حالا یه مشکل وجود داره:

منظور از ایجاد این رابطه این هست که ستون B در T۱ یا مقدارش از جدول T۲ می‌‌آید یا از جدول T۳. مشکل این هست که اگه یک رابطه ساده درست کنیم و T۱ را به T۲ و T۳ وصل کنیم SQL Server اجازه نمیدهد داده‌ای در T۱ وارد بشود مگر اینکه مقدار ستون B, هم در T۲ و هم در T۳ باشه. اما در رابطه‌ای که من نیاز دارم شرط هست که این مقدار باید یا در T۲ و یا در T۳ باشه. ستون State هم در T۱ برای همین طراحی شده که نشون بده داده ستون B از کدام جدول آماده.

حال اصلا این مساله درسته؟ (از نظر طراحی) اگر درسته آیا این کار در SQL Server امکان پذیر؟

با تشکر از همه دوستان که کمک میکنند

bahman_akbarzadeh
سه شنبه 30 تیر 1388, 14:54 عصر
از نظر طراحي، يكم ايراد داره.
اگر موقع برقراري Relation ، تيك Force رو برداريد، خطا نمي گيره. ولي اگه كليد، در هر دو جدول، وجود نداشته باشه، بازم خطا نمي گيره.
ميتونين از تريگر ها براي خواستتون استفاده كنين.
در ضمن براي اينكه بفهمين كه از كدوم جدول، كليد گرفته، ميتونين يه فيلد براي نگه داشتن شناسه جدولتون بگيرين.

scream666_ss
سه شنبه 30 تیر 1388, 16:54 عصر
با سلام. مرسی‌ از پاسخی که دادین

والا این force رو قبلان هم تست کردم اما بقول خودتون دیگه اصلا ایراد نمیگیره. اون فیلدیم که میگید گذاشتم. اما در مورد triger من با این آشنای ندارم می‌شه یکم بیشتر راهنماییم کنید یا لینکی‌ بدید که بخونم؟

بازم ممنون و متشکرم

saeedr22
سه شنبه 30 تیر 1388, 17:37 عصر
سلام
راحت ترین کاری که شما میتونین انجام بدین اینکه تو این قسمت اصلاً reletion رو بی خیال شین که به نظر من هم تو بعضی مواقع باید بی خیال شد.
ولی اگر به اون فیلد خارجی خاصیت isnull بدین مشکلتون حل میشه.
ولی تو جستجو دچار مشکل میشین که تو اون هم باید فقط از join استفاده کرد و inner و left رو باید بیخیال شین.

scream666_ss
سه شنبه 30 تیر 1388, 17:43 عصر
مرسی‌ از پاسخ شما

اما می‌دونم راههای زیادی هست مثل جدول میانی
اما چیزی که واسه من مهم هست اینه که این مساله توسط SQL Server چک بشه که اگه در جدول T۲ نبود در جدول T۳ باشه و اگر در هردو نبود پیغام خطا بده

بازم متشکرم

saeedr22
سه شنبه 30 تیر 1388, 18:53 عصر
اگه اینو بتونین تو سطح کد نویسی تو برنامه چک کنین مشکلتون حل نمیشه؟

EffatBandehlou
چهارشنبه 31 تیر 1388, 11:07 صبح
دوست عزيز بهترين راه حل نگذاشتن رابطه بين جداول هست و براي كنترل داده نيز توي كد نويسي كار كنيد.
البته چون تريگر بلد نيستيد.وگرنه با تريگر هم ميشه يه كارهايي كرد

bahman_akbarzadeh
چهارشنبه 31 تیر 1388, 11:25 صبح
اين تريگر رو براي جدول T1 بنويسين :



CREATE TRIGGER CheckRelation
ON T1
FOR INSERT, UPDATE
AS
IF NOT EXISTS (Select * From T2, T3, Inserted Where T2.B = inserted.B OR T3.B = Inserted.B)
RollBack Transaction


اول وارد جدول بشين و بعد Add Trigger رو بزنين.
با اين تريگر، اگه كليد مورد نظر، در جدول 2 و در جدول سه وجود نداشته باشه، عمليات ثبت ركورد لغو ميشه.

scream666_ss
چهارشنبه 31 تیر 1388, 11:26 صبح
سلام دوستان عزیز. میگم نوشتن این مساله اینقدر با trriger‌ها سخت که کسی‌ نمیتونه کدشو بهم بده؟
من باید این مساله را تو SQL Server حل کنم و کد نویسی جای خودشو داره این شرط باید تو مرحله SQL حل بشه
بازم از اینکه وقت میذارید و جواب میدید ممنونم

scream666_ss
چهارشنبه 31 تیر 1388, 11:27 صبح
آقا مرسی‌ دست شما درد نکنه

scream666_ss
دوشنبه 05 مرداد 1388, 09:28 صبح
اين تريگر رو براي جدول T1 بنويسين :



CREATE TRIGGER CheckRelation
ON T1
FOR INSERT, UPDATE
AS
IF NOT EXISTS (Select * From T2, T3, Inserted Where T2.B = inserted.B OR T3.B = Inserted.B)
RollBack Transaction


اول وارد جدول بشين و بعد Add Trigger رو بزنين.
با اين تريگر، اگه كليد مورد نظر، در جدول 2 و در جدول سه وجود نداشته باشه، عمليات ثبت ركورد لغو ميشه.



سلام برای اینکه این کد درست کار کنه من باید relation را کلا حذف کنم و در واقع جای SQL با این trigger چک کنم که relation درست باشه
در این صورت یه مشکل جدید پیش می‌‌آید که اگه یکی‌ در جدول T۲ یا T۳ رکردی را پاک کنه آن‌ وقت سیستم جدول T۱ را درست update نمی‌کنه.
برای اینکار باید روی دو جدول T۲ و T۳ یک trigger بنویسم که درواقع update و delete را چک کنه؟ درست متوجه شدم؟
بازهم ممنون و متشکرم