سه شنبه ۸ فروردین ۱۳۹۶
 
 
 
کلمه عبور خود را فراموش کرده اید؟
 

 
 
 تریگرها در SQL Server
Database / LINQ / EF
تاریخ ثبت:  ۸۷/۱۱/۴
تعداد نمایش:  ۱۷۰۹۲
  نویسنده: مسعود تکلو
 
   ۱۷  نفر تا این لحظه به این مقاله امتیاز داده اند.
 
   Bookmark and Share

مفهوم تریگر ها :

فرض کنید بخواهید مقدار فیلد شماره درس را در جدول Course تغییر دهید یا حذف کنید . ممکن است این مقدار در جدول Grade وجود داشته باشد . در این صورت ، اگر مقدار شماره درس در جدول course تغییر کند یا حذف شود ، اطلاعات جدول Grade که این شماره درس را دارند ، به رکوردهای نا معتبر تبدیل خواهند شد . به عنوان مثال دیگر ، فرض کنید شماره درسی را در جدول grade وارد کنید ، ولی این شماره درس در جدول Course موجود نیست . برای جلوگیری از این این مشکلات می توانید از تریگر ها استفاده کنید .ترگر ها ، نوع خاصی از رویه های ذخیره شده  اند که در هنگام تغییر داده های جدول برای محافظت از طراحی بانک اطلاعاتی فعال می شوند و از ورود داده های نا معتبر جلوگیری می کنند.

دو تفاوت بین ترگر ها و رویه های ذخیره شده :

۱-      تریگر ها فاقد پارامتر  هستند . ولی رویه های ذخیره شده می توانند پارامتر داشته باشد .

۲-      تریگر ها در هنگام تغییر داده های جدول فعال می شوند ، ولی رویه های ذخیره های ذخیره شده حتما باید فراخوانی شوند تا اجرا گردند.

 هر جدول می تواند حداکثر ۳ تریگر داشته باشد که عبارتند از :

تریگر در هنگام اضافه کردن رکورد (Insert )

o  تریگر در هنگام به روز رسانی رکورد ( Update )

o  تریگر در هنگام حذف رکورد ( Delete )

 به طور پیش فرض ، کلیه تریگر های جدول پس از تغییرات جدول فعال می شوند . این تریگر ها AFTER نام دارند . تریگر های دیگری نیز وجود دارند که INSTEAD OF نامیده می شوند و به جای تغییر در داده های مورد نظر ، باعث فعال سازی خودشان می شوند . در SQL SERVER تریگر ها از دو جدول Inserted و Deleted   استفاده می کنند . این جداول مضابه ساختار جدول پایه ای است که تریگر ، برای آن جدول ایجاد شده است. اگر کوردی به جدول اضافه کنید ، این رکورد علاوه بر این که در جدول پایه اضافه می شوند ، در جدول Inserted نیز اصافه خواهند شد . اگر رکوردی را در جدول پایه تغییر دهید ، این رکورد از جدول پایه حذف به جدول Deleted اضافه خواهد شد . رکورد جدید به جدول پایه و جدول Inserted اضافه می شود.

 نکته :  تریگر ها ، توابع بسیار خوبی برای استفاده هستند و جامعیت بانک اطلاعاتی را بررسی می کنند ، اما موجب افزایش I/O می گردند.

ایجاد تریگر ها در SQL Server

-          CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
{
    { { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }
        [ WITH APPEND ]
        [ NOT FOR REPLICATION ]
        AS
        [ { IF UPDATE ( column )
            [ { AND | OR } UPDATE ( column ) ]
                [ ...n ]
        | IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
                { comparison_operator } column_bitmask [ ...n ]
        } ]
        sql_statement [ ...n ]
    }
}

 

trigger_name :

نام تریگر را مشخص می کنند

 ON { table | view }:

 جدول یا دیدگاهی که تریگر برای ان ایجاد می شود را مشخص می کند که می تواند یک از جداول بانک یا دیدگه ها باشد.

 { { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }

{ FOR | AFTER | INSTEAD OF } :

 مشخص می کند که تریگر در چه زمانی اجر شود قبل از عمل ، بعد از عمل یا به جای عمل ..

 { [ INSERT ] [ , ] [ UPDATE ] } :

مشخص می کند که برای کدام عمل اصلی اعمال شود که  می تواند مقادیر (INSERT , UPDATE , DELETE)  باشد  اما قسمت اول

 sql_statement [ ...n ] :

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

مثال :

ایجاد تریگری به نام tr_delete که در هنگام حذف رکوردی از جدول type فعال شود.

 Create Trigger tr_delete  

ON type

FOR DELETE AS

      Raiserror('%d record delete ' ,0,1,@@rowcount)

ایجاد تریگری برای به نام tr_delete1 که  به جای عملیات delete جدول type فعال می شود.

 Create Trigger tr_delete1

On type

INSTEAD OF delete AS

      Delete from temp where id=@@identity

ایجاد تریگری به نام tr_InUp که در هنگام اضافه کردن و یا ویرایش رکورد فعال می شود.

 Create Trigger tr_InUp

ON type

FOR INSERT , UPDATE

AS

Raiserror('%d redord inserted or updateted',0,1,@@rowcount)

 تغییر تریگر در بانک اطلاعاتی SQL Server

برای این منظور از دستور ALTER TRIGGER استفاده کنید.

ALTER TRIGGER trigger_name
ON ( table | view )
[ WITH ENCRYPTION ]
{
    { ( FOR | AFTER | INSTEAD OF ) { [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] }
        [ NOT FOR REPLICATION ]
        AS
        sql_statement [ ...n ]
    }
یا  
    { ( FOR | AFTER | INSTEAD OF ) { [ INSERT ] [ , ] [ UPDATE ] }
        [ NOT FOR REPLICATION ]
        AS
        { IF UPDATE ( column )
        [ { AND | OR } UPDATE ( column ) ]
        [ ...n ]
        | IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
        { comparison_operator } column_bitmask [ ...n ]
        }
        sql_statement [ ...n ]
    }
}

 trigger_name :

نام تریگر را مشخص می کنند.

 ON { table | view }:

 جدول یا دیدگاهی که تریگر برای ان ایجاد می شود را مشخص می کند که می تواند یک از جداول بانک یا دیدگه ها باشد.

    { { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }

{ FOR | AFTER | INSTEAD OF } :

مشخص می کند که تریگر در چه زمانی اجر شود قبل از عمل ، بعد از عمل یا به جای عمل ..

{ [ INSERT ] [ , ] [ UPDATE ] } :

 مشخص می کند که برای کدام عمل اصلی اعمال شود که  می تواند مقادیر (INSERT , UPDATE , DELETE)  باشد  اما قسمت اول

sql_statement [ ...n ] :

مثال :      دستوراتی که عملکرد تریگر tr_delete را تغییر میدهد به طوری که رکوردی را از جدول student حذف کرده و پیغامی به کاربر نمایش می دهد.

Alter Trigger tr_delete

On Student

FOR DELETE

AS

PRINT ('record deleted')

 حذف تریگر :

 برای این منظور از دستور DROP TRIGGER استفاده کنید.

 DROP TRIGGER { trigger}[,…n]

 Trigger…n  : تریگر هایی هستند که باید حذف شوند

مثال :     دستوراتی که تریگر tr_delete  tr_InUp, را حذف می کند.

 DROP TRIGGER tr_delete , tr_InUp

  کیفیت مقاله ارائه شده از نظر شما   
برای دادن رتبه به این مقاله می بایست Login کرده باشید.
  درباره نویسنده
مسعود تکلو
عضو گروه برنامه نویسی مشهد , و عضویت در شرکت متخصصان فناوری شرق با ریاست آقای محمد ژاله پور
همه مقاله های نوشته شده توسط این کاربر (۶)
 
  پیام جدید
صفحه ۱ - پیامهای اصلی ۱ تا ۱ از مجموع ۱ پیام اصلی
اولین قبلی بعدی

 عنوان فرستنده تاریخ
 
تشکر محمد صادق نگهبان فرد ۱۳۸۷/۱۱/۱۰
اولین قبلی بعدی

Copyright © 2006 - 2016 All Rights Reserved.
Please direct your questions or comments to