PDA

View Full Version : چگونگی حذف آبشاری



ahmad_rabie
یک شنبه 12 تیر 1384, 12:46 عصر
سلام من یک سئوال دارم که مطرح می کنم و راه حلهای مختلفی که رفته ام را می نویسم و شما ببینید چه راه حلی برای این مشکل بنظرتان می رسد ؟
من یک جدول دارم که داخل آن پست های سازمانی را وارد می کنم داخل این جدول فیلدهای مختلفی را دارم که دوتای آن موضوع این سئوال است .
فیلد اول من یک فیلد Primary به نام PostID می باشد که به هر پست یک کد اختصاص می دهد
فیلد دوم فیلد FatherPostID می باشد که کار آن این هست که مشخص کند این پست زیر مجموعه کدام پست است .
بعنوان مثال چند رکورد از این جدول به شکل زیر است .
کد : 1 عنوان : ریاست سازمان کد پدر : 0
کد : 2 عنوان : معاونت سازمان کد پدر : 1
کد : 3 عنوان : مسئول دفتر معاونت سازمان کد پدر : 2
در این سه رکورد معنی آن نهفته است که پست معاونت زیر مجموعه پست ریاست است و پست مسئول دفتر معاونت زیر مجموعه پست معاونت .
یک ساختار سلسله مراتبی درختی که در تمام سازمانها مرسوم می باشد را در نظر بگیرید تا متوجه مطلب شوید .
حال مشکل من این است که اگر من بین فیلد PostID و فیلد FatherPostID یک ارتباط (relation) برقرار کنیم دیتابیس SQL server اجازه نخواهد داد که حذف آبشاری یا Cascade Delete را تیک بزنید و اجازه حذف آبشاری را نمیدهد .
من سعی کردم مشکلم را با یک تریگر که هر رکوردی از جدول حذف می شد این تریگر فعال می شد و تمام رکوردهای فرزند را حذف می کرد .
این تریگر زمانی درست جواب می داد که بعنوان مثال در مثال بالا پست معاونت حذف شود در این حالت پست مسئول دفتر نیز حذف می شد . اما اگر پست ریاست حذف شود فقط پست معاونت بعنوان زیر مجموعه ریاست حذف می شد و پست مسئول دفتر حذف نمی شد .
در حالی که من می خواهم وقتی یک رکورد حذف شود تمام زیر مجموعه های آن حتی اگر ده سطح هم پیش آمده باشد حذف گردد .
از راههای زیادی سعی کردم این کار را انجام دهم ولی نشد . حال اگر کسی این کار را انجام داده و یا می تواند این مشکل را حل کند لطفا راهنمایی کنید .
با تشکر در ضمن TSQL هم بلدم یعنی اگر از طریق کد نویسی می شود حل کرد راهنمایی کنید .

titbasoft
یک شنبه 12 تیر 1384, 16:39 عصر
یه سر به این تاپیک بزنید بد نیست (به پست های آقای ثباتی دقت کنید). شاید کمکتون کنه: http://www.barnamenevis.org/forum/viewtopic.php?t=21055

AminSobati
دوشنبه 13 تیر 1384, 00:24 صبح
دوست عزیزم،
با استفاده از روش Adjacency List Model که در لینک بالا ذکر شده میتونین یک جدول موقتی تشکیل بدین از ID مورد نظر به همراه تمام زیر مجموعه هاش. حالا هر رکورد در جدول اصلی که ID اون در جدول موقتی هم باشه باید حذف بشه. دو روش هست برای این کار:

DELETE MyTable WHERE RowID IN (SELECT RowID FROM @TempTable)
یا

DELETE MyTable FROM @TempTable WHERE MyTable.RowID=@TempTable.RowID