تریگر (Trigger) چیست ؟

پنجشنبه 26 اردیبهشت 1392

تریگر (Trigger) چیست ؟ <br/> Trigger نوعی رویه ذخیره شده است که پس از یک رویداد اجرا می شود ، برخلاف Stored Procedure که حتما باید فراخوانی شود Trigger ها قابل فراخوانی نبوده و به صورت خودکار در واکنش به اعمال Insert , Update , Delete (قبل یا بعد از تراکنش) اجرا می شوند .

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 مطابق شکل زیر عمل کنید  :

 

 

همانطور که ملاحظه می کنید فرمت یک Trigger در سمت راست نمایش داده شده است ، پس از واژه Create trigger نام Trigger ذکر شده و سپس واژه On و پس از آن نام جدولی که مد نظر ماست ذکر می شود ، سپس واژه  After  و  یکی از تراکنش های Insert , Delte  یا Update و سپس کدها ما پس از Begin قرار خواهد گرفت .

برای نمونه کد مثال اول را به صورت زیر می نویسیم :

پس نوشتن کد فوق دکمه 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

 

ایمان مدائنی

نویسنده 1299 مقاله در برنامه نویسان

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

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید