PDA

View Full Version : کلید خارجی



ms1987
یک شنبه 05 تیر 1390, 09:55 صبح
سلام دوستان
2 تا جدول دارم که در جدول شماره 2 فیلد مثلا uid کلید خارجی از جدول شماره 1 هست، حالا میخوام اگه یکی از uidها رو از جدول اصلی (شماره 1) حذف کردم در جدول دوم مقدار اون uid (کلید خارجی) null بشه. چطور میتونم این کار رو بکنم؟

Galawij
یک شنبه 05 تیر 1390, 10:13 صبح
2 تا جدول دارم که در جدول شماره 2 فیلد مثلا uid کلید خارجی از جدول شماره 1 هست، حالا میخوام اگه یکی از uidها رو از جدول اصلی (شماره 1) حذف کردم در جدول دوم مقدار اون uid (کلید خارجی) null بشه. چطور میتونم این کار رو بکنم؟
سلام
چرا null بشه؟ می تونید اون رکورد را هم در جدول دوم حذف کنید برای این کار کافیه درProperties،مربوط به دیاگرام جداولتون روی آن ارتباط کلیک کنید و گزینه Delete Rule را روی حالت Cascade قرار دهید این طوری به محض اینکه رکوردی در جدول اصلی حذف بشه در جدول دوم هم معادلهای آن رکورد به صورت اتوماتیک حذف می شوند.
ولی اگر می خواهید Nullباشد روی جدول اصلیتون یک تریگر بنویسید که به محض حذف از این جدول مقادیر جدول دوم را معادل Null قراردهد.
موفق باشید...

ms1987
سه شنبه 07 تیر 1390, 09:46 صبح
سلام
ممنون از جوابتون.
آره حتما میخوام همون null باشه نمیخوام حذف بشه. میشه در مورد نوشتن اون تریگر بیشتر توضیح بدین. اگه لطف کنین کدش رو بذارید خیلی ممنون میشم

Galawij
شنبه 11 تیر 1390, 08:16 صبح
Trigger چیست؟
تریگر نوعی رویه ذخیره شده است که پس از یک رویداد اجرا می شود، برخلاف Stored Procedure که حتما باید فراخوانی شود Trigger ها قابل فراخوانی نبوده و به صورت خودکار در واکنش به اعمالInsert , Update , Delete (قبل یا بعد از تراکنش) اجرا می شوند.
واضح است که چنین رویه بر خلاف SP نمیتواند پارامتر ورودی و خروجی بپذیردو اطلاعات خود را از رکورد مورد نظر (رکوردی که Insert , Update یا Delete بر روی آن صورت گرفته که اصطلاحا Updated , Inserted و Deleted خوانده میشود) می گیرد.
مهمترین کاربر Triggerها به شرح زیر است:
· جلوگیری از ورود داده های نا معتبر
· لاگ نمودن تراکنش ها
· حذف یا به روز رسانی رکورد ها در جداول مرتبط
· بالا بردن کارایی سیستم
· تغییر و جایگزینی یک تراکنش
و...

به دلیل اینکه Triggerها خیلی سریع عمل می کنند برای ما بسیار سودمند خواهند بود، برای روش شدن مطلب چند مثال میزنم:

فرض کنید یک جدول کاربران دارید، میخواهیم اگر یک یک رکورد از اینجدول حذف شد، رکوردهایی از جداول مختلف حذف شده و برخی هم تغییر کنند.شاید بگوید که Relationها این کار را انجام می دهند در صورتی که اینطور نیست و خیلی جای مانور وجود ندارد، اما با یک Trigger ساده After Deleteمیتوانید این کار را به سادگی انجام دهید.
فرض کنید جدول کاربران شما دارای یک ستون اعتبار است، و یک جدول دیگر برای ثبت اعتبار های کسر شده یا اضافه شده وجود دارد، مایلیم هر گاه یک رکورد به جدول اعتبارها اضافه شد ستون اعتبار جدول کاربر نیز به روز شود. از اعتبار کاربر کسر شده یا به آن اضافه شود، این کار را میتوانید در کد نویسی یا در SP انجام دهید ولی بهترین جای قرار گیری آن در Trigger است. چرا که استثنا ندارد یعنی به هر طریقی رکوردی کم و زیاد شود به روز رسانی انجام خواهد شد در ضمن بسیار سریع عمل می کند.
لاگ کردن رویداد ها نیز استفاده دیگری از Triggerها است، شما میتوانید تراکنش های بانک اطلاعاتی را لاگ کنید.
فرض کنید قرار است در یک جدول اطلاعاتی وارد شود، ممکن است این اطلاعات تکراری باشند، برای جلوگیری از تکرار معمولا ما از IF استفاده میکنیم بدین معنی که چک می کنیم اگر این داده در بانک باشد از درج آن جلوگیری می کنیم، این شرط را میتوان در کدنویسی سمت سرور یا در SP قرار داد ولی بازهم بهترین جا برای قرار دادن آن در یکTrigger می باشد. برای ایجاد یک Trigger مطابق شکل زیر عمل کنید:
71794
همانطور که ملاحظه می کنید فرمت یک Trigger در سمت راست نمایش داده شده است، پس از واژه Create trigger نام Trigger ذکر شده و سپس واژه Onوپس از آن نام جدولی که مد نظر ماست ذکر می شود، سپس واژه After و یکی از تراکنش های Insert , Delete یا Update و سپس کدها ما پس از Begin قرار خواهد گرفت.برای نمونه کد مثال اول را به صورت زیر می نویسیم:
Create Trigger DeleteBlogsAfterDeleteUser
ON dbo.TBBlogs
After Delete
AS
Begin
Declare @UserID int;
Set @UserID=(Select Userid From Deleted)
Delete From dbo.TBBlogs Where UserId = @UserID
End
پس نوشتن کد فوق دکمه Execute را بفشارید تا Triggerایجاد شود، برای ویرایش آن هم میتوانید روی Trigger کلیک راست کرده و گزینه Alter را انتخاب کنید.همانطور که ملاحظه می کنیدبرای بدست آوردن کد کاربری که حذف شده است از یک دستور Select ساده استفاده کرده ام، نکته مهم اینجاست که به جاینام جدول از کلمه "Deleted" استفاده شده یعنی "رکورد (یا رکوردهای) حذف شده"، این قضیه برای Insertو Update نیز صادق است یعنی"Inserted" و "Updated" ، سپس مقدار بدست آمده از دستورSelect را در یک متغیر به نام @UserID ذخیره کرده و در شرط حذف از آن استفاده کردیم. از این پس هر رکوردی از جدول TBLUsersحذف شود تمام رکوردهای جدول TBLBlogsنیز حذف خواهد شد. البته در این مثال می توانستیم از Relationها جهت این عمل استفاده کنیم ولی در بسیاری از شرایط بین بسیاری از جداول Relation وجود ندارد ولی ما میخواهیم تراکنش ها روی سایر جداول نیز تاثیر بگذارند، بنابراین نیاز به Trigger ها امری مشخص است. برخی از برنامه نویسان به جای استفاده از Trigger این اعمال را در لایه Bussiness Logic انجام می دهند (مثلا پس از یک تراکنش یک Query دیگر اجرا می کنند). این کار با افزایش تعداد تراکنش هاباعث افت کارایی سیستم خواهد شد.
برای مشاهده مثال های بیشتر میتوانید این (http://msdn.microsoft.com/en-us/library/aa258254%28SQL.80%29.aspx)صفحه (http://msdn.microsoft.com/en-us/library/aa258254%28SQL.80%29.aspx)را مطالعه بفرمایید.

mfathi
جمعه 27 مرداد 1391, 10:21 صبح
ببخشید کلید خارجی اطلا چیه؟