نمایش نتایج 1 تا 30 از 30

نام تاپیک: آموزش کار با تریگر

Threaded View

پست قبلی پست قبلی   پست بعدی پست بعدی
  1. #1

    Post آموزش کار با تریگر

    سلام.
    چند تا پست دیدم که تو تریگر اشکال داشتند.
    گرچه در این زمینه مطلب زیاد هست ؛ لازم دیدم کمی در موردش توضیح بدم. (با اجازه اساتید)

    تریگر شیی در SQL هست که دستوراتی رو در مواقعی خاص (بعد از اقدام به تغییرات داده در جدول خاص - در عوض اعمال تغییرات داده در جدول خاص) برای ما اجرا می کنه که حتما لازم نیست روی جدول معین شده کار انجام بشه.
    این شی دستورات خودش رو روی سرور اس کیو ال اجرا می کنه.
    اما چرا تریگر؟
    مواقعی هست که از چند طریق مختلف مثل پروسیجر ها - دستورات کامند ها در UI و یا جاهای دیگه ای اقدام به تغییر داده (Insert - Update - Delete) در جدول مشخصی می کنیم.
    پس از مدتی متوجه میشیم که مثلا قبل از انجام این کارها باید کار مهمی رو انجام میدادیم. مثلا کنترل های تعدادی و ...
    اگر بنا باشه که تمام جاهایی که از اون ها تغییرات داده روی جدول اعمال میشد رو دست بزنیم هم طولانی هست - هم گاهی باید EXE مجدد کامپایل شه - هم معمولا یکی دو جا از قلم می افته.
    برای این کار یک تریگر تعریف می کنیم که مواظب جدول ما باشه و هر وقت هر چیزی خواست دست به این جدول بزنه (Select ایرادی نداره) به جاش یا بعدش (در تعریف مشخص می کنیم) دستوراتی رو اجرا کنه که این دستورات تقریبا می تونه هر چیزی باشه. (مثل دستوراتی که در Procedure می نویسیم . حتی Select کنه اما Select خالی که به درد نمی خوره)
    در این جاست که کنترل خودمون رو تعریف می کنیم.

    انواع تریگر :
    تریگری که بعد از انجام کار باید اجرا شود (مثال : به روز رسانی جدول خاصی از روی مقادیر این جدول)
    تریگری که به جای انجام کاری باید اجرا شود (مثال : کنترل موجودی - اگر موجودی کافی نبود نباید کار خواسته شده انجام شود)

    نحوه تعریف تریگر:
    Create Trigger Trig_Name On TableOrViewName After InsertOrUpdateOrDelete as bla bla
    Create Trigger Trig_Name On TableOrViewName Instead Of InsertOrUpdateOrDelete as bla bla
    Create Trigger Trig_Name On TableOrViewName For InsertOrUpdateOrDelete as bla bla

    For در نسخه های قدیمی به جای After بود. هر دوش یه چیزه.

    نکته مهم:
    تریگر ها روی جداول فیزیکی می تونن گذاشته بشن نه جداول موقتی مثل # یا ## یا @.
    تریگر ها پارامتر ندارند.

    مثال های سریع:

    Create Trigger Trig1 On Table1 Instead Of Insert, Update as blabla
    Create Trigger Trig2 On Table2 After Delete, Insert as blabla
    Alter Trigger Trig1 On Table3 For Delete as blabla

    اما چه جوری با تریگر کار کنیم؟
    در طول عمر یک تریگر دو تا جدول به وجود میان به نامهای Inserted و Deleted که از اونها می شه استفاده کرد. اما نمیشه بهشون دست زد.
    به این جداول می گن جداول منطقی.
    تو این جدولها اطلاعات جدولی هست که قرار بوده داده هاش رو دست بزنیم و ما رو اون تریگر گذاشتیم.
    اگر گفته بودیم که حساس باشه به Insert کردن، اونوقت Inserted حاوی داده های ما بود که قرار بوده Insert شه یا Insert شده و Deleted خالیه. (بسته به نوع تریگر)
    اگر گفته بودیم که حساس باشه به Delete کردن، اونوقت Deleted حاوی داده های ما بود که قرار بوده Delete شه یا Delete شده و Inserted خالیه.
    اگر گفته بودیم که حساس باشه به Update کردن، اونوقت Deleted حاوی داده های قبلی این جدول بود و Inserted حاوی اطلاعات جدید ما که قرار بوده جایگزین بشه یا جایگزین شده.

    حالا یه مثال یه کمی مشروح:
    اگر جدولی داشته باشیم به نام Tbl1 با ستونهای ID و Amnt و تریگری مثل این تعریف کرده باشیم:
    Create trigger Trig1 On TBL1 Instead Of Delete as
    delete TBL1 where ID in(select ID from Deleted)and Amnt > 1000

    اونوقت هنگام Delete کردن اگر Amnt > 1000 باشه دستور ما اجرا میشه.
    از کجا فهمیدیم چیا باید Delete شن؟

    آفرین!


    اما گاهی که تریگر همزمان برای چند کار مثل Update و Delete ست شده تو تریگر از کجا میشه فهمید چه کاری قرار بوده انجام بشه؟
    از روی داده های جداول منطقی.
    اگر Inserted پر بود و Deleted خالی بود = Insert
    اگر Inserted خالی بود و Deleted پر بود = Delete
    اگر Inserted پر بود و Deleted پر بود = Update


    هر جاش گنگ بود بگید تا اگه می دونستم کمک کنم.

    راستی! تریگر روی ویو هم مجازه اما فقط از نوع Instead Of چون نمیشه به اطلاعاتش مستقیم دست زد.

    موفق باشید.
    آخرین ویرایش به وسیله یوسف زالی : دوشنبه 25 فروردین 1393 در 12:24 عصر
    توابع تبدیل تاریخ با دقت 5000 سال
    پذیرش پروژه، کامپوننت، آموزش برنامه نویسی (دلفی، اس کیو ال، ..) -> 09123780840
    پایگاه داده، تیونینگ، طراحی و پیاده سازی ..

برچسب های این تاپیک

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •