CREATE TRIGGER (Transact-SQL)

ساخت وبلاگ

یک راه انداز DML، DDL یا لاگین ایجاد می کند. تریگر نوع خاصی از رویه های ذخیره شده است که به صورت خودکار زمانی که رویدادی در سرور پایگاه داده رخ می دهد اجرا می شود. هنگامی که کاربر سعی می کند داده ها را از طریق یک رویداد زبان دستکاری داده (DML) تغییر دهد، راه اندازی های DML اجرا می شوند. رویدادهای DML عبارت های INSERT، UPDATE یا DELETE در جدول یا نما هستند. زمانی که هر رویداد معتبری فعال می شود، چه ردیف های جدول تحت تأثیر قرار گرفته باشند و چه نباشند، این موارد فعال می شوند. برای اطلاعات بیشتر، به محرک های DML مراجعه کنید.

تریگرهای DDL در پاسخ به انواع رویدادهای زبان تعریف داده (DDL) اجرا می شوند. این رویدادها عمدتاً با دستورات Transact-SQL CREATE، ALTER، و DROP و رویه های ذخیره شده خاصی که عملیات های DDL مانند را انجام می دهند، مطابقت دارند.

Logon در پاسخ به رویداد LOGON که هنگام برقراری جلسه کاربر ایجاد می شود، آتش را راه اندازی می کند. می توانید مستقیماً از دستورات Transact-SQL یا از روش های اسمبلی که در زمان اجرا زبان مشترک Microsoft .net Framework (CLR) ایجاد می شوند و در نمونه ای از SQL Server آپلود می شوند، تریگرها ایجاد کنید. SQL Server به شما این امکان را می دهد که برای هر عبارت خاص چندین تریگر ایجاد کنید.

کدهای مخرب داخل تریگرها می توانند تحت امتیازات افزایش یافته اجرا شوند. برای اطلاعات بیشتر در مورد نحوه کاهش این تهدید، به مدیریت Trigger Security مراجعه کنید.

ادغام NET Framework CLR در SQL Server در این مقاله مورد بحث قرار گرفته است. ادغام CLR برای پایگاه داده Azure SQL اعمال نمی شود.

نحو سرور SQL

نحو پایگاه داده Azure SQL

برای مشاهده نحو Transact-SQL برای SQL Server 2014 و نسخه های قبلی، به مستندات نسخه های قبلی مراجعه کنید.

استدلال ها

OR ALTER برای: پایگاه داده Azure SQL، SQL Server (شروع با SQL Server 2016 (13. x) SP1) اعمال می شود.

تنها در صورتی که ماشه از قبل وجود داشته باشد، مشروط را تغییر می دهد.

schema_name نام طرحواره ای که تریگر DML به آن تعلق دارد. تریگرهای DML به طرح جدول یا نمایه ای که در آن ایجاد شده اند، قرار می گیرند. schema_name را نمی توان برای راه اندازهای DDL یا ورود به سیستم مشخص کرد.

trigger_name نام ماشه. یک trigger_name باید از قوانین شناسه ها پیروی کند، با این تفاوت که trigger_name نمی تواند با # یا ## شروع شود.

جدول |مشاهده جدول یا نمایی که تریگر DML روی آن اجرا می شود. این جدول یا نمای گاهی اوقات به عنوان جدول ماشه یا نمای ماشه نیز شناخته می شود. تعیین نام کاملاً واجد شرایط جدول یا نما اختیاری است. شما فقط می توانید یک نما را به جای ماشه ارجاع دهید. شما نمی توانید تریگرهای DML را در جداول موقت محلی یا جهانی تعریف کنید.

بانک اطلاعاتی دامنه یک ماشه DDL را در پایگاه داده فعلی اعمال می کند. در صورت مشخص شدن ، هر زمان که event_type یا event_group در پایگاه داده فعلی رخ می دهد ، ماشه آتش می گیرد.

همه سرور در مورد: SQL Server 2008 (10. 0. x) و بعداً اعمال می شود.

دامنه یک محرک DDL یا ورود به سرور فعلی را اعمال می کند. در صورت مشخص شدن ، هر زمان که event_type یا event_group در هر نقطه از سرور فعلی رخ می دهد ، ماشه آتش می گیرد.

با رمزگذاری در مورد: SQL Server 2008 (10. 0. x) و بعد از آن اعمال می شود.

متن عبارت Create Trigger را مبهم می کند. استفاده از رمزگذاری مانع از انتشار ماشه به عنوان بخشی از تکثیر سرور SQL می شود. با رمزگذاری برای محرکهای CLR مشخص نمی شود.

اجرا همانطور که زمینه امنیتی را که در آن ماشه اجرا می شود ، مشخص می کند. شما را قادر می سازد تا کنترل کنید که نمونه SQL Server برای تأیید مجوزها در هر شیء پایگاه داده که توسط ماشه ارجاع شده است ، از کدام حساب کاربری استفاده می کند.

این گزینه برای محرک های جداول بهینه شده حافظه لازم است.

Native_compilation نشان می دهد که ماشه به طور بومی گردآوری شده است.

این گزینه برای محرک های جداول بهینه شده حافظه لازم است.

Schemabinding تضمین می کند که جداول ارجاع شده توسط یک ماشه قابل کاهش یا تغییر نیست.

این گزینه برای محرک های جداول بهینه شده حافظه لازم است و برای محرک های جداول سنتی پشتیبانی نمی شود.

برای |پس از یا بعد از آن مشخص می کند که DML باعث آتش سوزی می شود که تمام عملیات مشخص شده در بیانیه SQL با موفقیت آغاز شده است. تمام اقدامات آبشار مرجع و بررسی های محدودیت نیز باید قبل از آتش سوزی این محرک موفق شوند.

شما نمی توانید بعد از محرک های دیدگاه تعریف کنید.

به جای این که مشخص کند که محرک DML به جای بیانیه SQL تحریک می شود ، بنابراین ، بر اقدامات اظهارات تحریک کننده غلبه می کند. شما نمی توانید به جای محرک های DDL یا ورود به سیستم مشخص کنید.

حداکثر ، شما می توانید یکی را به جای ماشه در هرج ، به روزرسانی یا حذف بیانیه در یک جدول یا نمای تعریف کنید. همچنین می توانید دیدگاه هایی را در مورد نمایش ها تعریف کنید که در آن هر نمای به جای ماشه دارای خاص است.

شما نمی توانید به جای محرک در نماهای به روزرسانی که از گزینه Check استفاده می کنند ، تعریف کنید. انجام این کار منجر به خطا می شود که به جای ماشه با گزینه بررسی مشخص شده به یک نمایش به روزرسانی اضافه شود. قبل از تعریف به جای ماشه ، آن گزینه را با استفاده از Alter View حذف می کنید.

<[ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ]>عبارات اصلاح داده ها را مشخص می کند که راه انداز DML را هنگامی که در مقابل این جدول یا نما امتحان می شود، فعال می کند. حداقل یک گزینه را مشخص کنید. از هر ترکیبی از این گزینه ها به هر ترتیبی در تعریف ماشه استفاده کنید.

برای به جای محرک ها، نمی توانید از گزینه DELETE در جداولی که رابطه ارجاعی دارند استفاده کنید و یک اقدام آبشاری در DELETE را مشخص کنید. به طور مشابه، گزینه UPDATE در جداولی که دارای رابطه ارجاعی هستند، مجاز نیست و یک اقدام آبشاری در به روز رسانی را مشخص می کند.

WITH APPEND برای: SQL Server 2008 (10. 0. x) تا SQL Server 2008 R2 (10. 50. x) اعمال می شود.

مشخص می کند که یک ماشه اضافی از نوع موجود باید اضافه شود. WITH APPEND را نمی توان به جای محرک ها یا در صورتی که ماشه AFTER به صراحت ذکر شده باشد استفاده کرد. برای سازگاری با عقب، فقط زمانی از WITH APPEND استفاده کنید که FOR مشخص شده باشد، بدون STEAD O یا بعد. نمی توانید WITH APPEND را مشخص کنید که از EXTERNAL NAME استفاده می کند (یعنی اگر ماشه یک ماشه CLR باشد).

event_type نام یک رویداد زبان Transact-SQL که پس از راه اندازی، باعث فعال شدن تریگر DDL می شود. رویدادهای معتبر برای محرک های DDL در رویدادهای DDL فهرست شده اند.

event_group نام گروه بندی از پیش تعریف شده رویدادهای زبان Transact-SQL. ماشه DDL پس از راه اندازی هر رویداد زبان Transact-SQL که به event_group تعلق دارد فعال می شود. گروه های رویداد معتبر برای محرک های DDL در گروه های رویداد DDL فهرست شده اند.

پس از پایان اجرای CREATE TRIGGER، event_group با افزودن انواع رویدادهایی که پوشش می دهد به نمای کاتالوگ sys. trigger_events به عنوان یک ماکرو عمل می کند.

NOT FOR RePLICATION برای: SQL Server 2008 (10. 0. x) و بالاتر اعمال می شود.

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

sql_statement شرایط و اقدامات ماشه. شرایط راه اندازی معیارهای دیگری را مشخص می کند که تعیین می کند آیا رویدادهای DML، DDL یا ورود به سیستم باعث اجرای اقدامات ماشه می شوند یا خیر.

اقدامات ماشه ای که در دستورات Transact-SQL مشخص شده اند، زمانی که عملیات آزمایش می شود، اعمال می شوند.

تریگرها می توانند شامل هر تعداد و نوع عبارات Transact-SQL باشند، به استثنای. برای اطلاعات بیشتر، به اظهارات مراجعه کنید. یک ماشه برای بررسی یا تغییر داده ها بر اساس اصلاح داده یا بیانیه تعریف طراحی شده است. نباید داده ها را به کاربر برگرداند. عبارات Transact-SQL در یک ماشه اغلب شامل زبان کنترل جریان است.

محرک های DML از جداول حذف شده و درج منطقی (مفهومی) استفاده می کنند. آنها از لحاظ ساختاری شبیه به جدول هستند که ماشه در آن تعریف شده است ، یعنی جدول که عملکرد کاربر در آن محاکمه شده است. جداول حذف شده و درج شده مقادیر قدیمی یا مقادیر جدید ردیف ها را که ممکن است با عمل کاربر تغییر یابد ، نگه می دارد. به عنوان مثال ، برای بازیابی تمام مقادیر موجود در جدول حذف شده ، استفاده کنید:

DDL و Logon با استفاده از عملکرد EventData (Tranact-SQL) اطلاعات مربوط به رویداد تحریک را به دست می آورند. برای اطلاعات بیشتر ، از عملکرد EventData استفاده کنید.

SQL Server اجازه می دهد تا به جای ماشه در جداول یا نماها ، ستون های متن ، ntext یا تصویر را به روز کنید.

انواع داده های NTEXT ، متن و تصویر در نسخه بعدی Microsoft SQL Server حذف می شوند. از استفاده از این انواع داده ها در کارهای جدید توسعه خودداری کنید و برنامه ریزی کنید تا برنامه هایی را که در حال حاضر از آنها استفاده می کنند اصلاح کنید. به جای آن از nvarchar (max) ، varchar (max) و varbinary (max) استفاده کنید. پس از و به جای محرک ها از داده های وارچار (حداکثر) ، NVARCHAR (حداکثر) و داده های واربی (حداکثر) در جداول درج شده و حذف شده پشتیبانی می کنند.

برای محرک های جداول بهینه شده حافظه ، تنها SQL_Statement مجاز در سطح بالا یک بلوک اتمی است. T-SQL مجاز در داخل بلوک اتمی توسط T-SQL مجاز در داخل PROC های بومی محدود است.

اعمال می شود: SQL Server 2008 (10. 0. x) و بعد.

برای یک ماشه CLR ، روش یک مونتاژ را برای اتصال با ماشه مشخص می کند. این روش نباید استدلال کند و باطل برگردد. class_name باید یک شناسه معتبر SQL Server باشد و باید به عنوان یک کلاس در مونتاژ با دید مونتاژ وجود داشته باشد. اگر کلاس دارای نام واجد شرایط نام است که از "" استفاده می کند. برای جدا کردن قطعات فضای نام ، نام کلاس باید با استفاده از محدود کننده [] یا "" محدود شود. کلاس نمی تواند یک کلاس تو در تو باشد.

به طور پیش فرض ، توانایی SQL Server برای اجرای کد CLR خاموش است. شما می توانید اشیاء پایگاه داده را ایجاد ، اصلاح و رها کنید که ماژول های کد مدیریت شده را مرجع می کنند ، اما این منابع در نمونه ای از SQL Server اجرا نمی شوند ، مگر اینکه گزینه فعال شده CLR با استفاده از sp_configure فعال شود.

اظهارات برای محرک های DML

محرک های DML اغلب برای اجرای قوانین تجاری و یکپارچگی داده ها استفاده می شوند. SQL Server یکپارچگی مرجع اعلامی (DRI) را از طریق جدول تغییر داده و بیانیه های جدول ایجاد می کند. با این حال ، DRI یکپارچگی مرجع داده های متقابل را ارائه نمی دهد. یکپارچگی مرجع به قوانین مربوط به روابط بین کلیدهای اصلی و خارجی جداول اشاره دارد. برای اجرای یکپارچگی مرجع ، از محدودیت های اصلی کلید و کلید خارجی در جدول Alter و ایجاد جدول استفاده کنید. اگر محدودیت هایی در جدول Trigger وجود داشته باشد ، آنها بعد از اجرای ماشه و قبل از اجرای ماشه بررسی می شوند. اگر محدودیت ها نقض شود ، به جای اقدامات ماشه به عقب چرخانده می شود و ماشه پس از آن اخراج نمی شود.

می توانید اولین و آخرین بعد از محرک ها را با استفاده از sp_settriggerorder روی یک جدول مشخص کنید. شما می توانید فقط یک مورد اول و یک آخرین بعد از ماشه را برای هر درج ، به روزرسانی و حذف عملکرد روی یک جدول مشخص کنید. اگر بعد از محرک های دیگری در همان جدول وجود داشته باشد ، آنها به طور تصادفی اجرا می شوند.

اگر یک بیانیه ماشه ALTER یک ماشه اول یا آخرین را تغییر دهد ، اولین یا آخرین ویژگی تنظیم شده روی ماشه اصلاح شده کاهش می یابد ، و شما باید با استفاده از sp_settriggerorder مقدار سفارش را مجدداً تنظیم کنید.

یک ماشه پس از اجرا فقط پس از اجرای موفقیت آمیز SQL اجرا می شود. این اجرای موفقیت آمیز شامل کلیه اقدامات آبشار مرجع و بررسی های محدودیت مرتبط با شیء به روز شده یا حذف شده است. بعد از آن به جای ماشه به جای ماشه در همان جدول ، به صورت بازگشتی شلیک نمی کند.

اگر به جای ماشه که روی یک جدول تعریف شده است ، بیانیه ای را علیه جدول اجرا کند که معمولاً به جای ماشه دوباره آتش می گیرد ، ماشه به صورت بازگشتی خوانده نمی شود. در عوض ، این بیانیه به گونه ای فرآیند می کند که گویی جدول به جای ماشه وجود ندارد و زنجیره ای از عملیات محدودیت و بعد از اعدام های ماشه را شروع می کند. به عنوان مثال ، اگر یک ماشه به جای درج ماشه برای یک جدول به عنوان یک ماشه تعریف شود. و ، Trigger یک عبارت درج را در همان جدول اجرا می کند ، بیانیه درج راه اندازی شده توسط به جای ماشه دوباره به ماشه تماس نمی گیرد. درج راه اندازی شده توسط ماشه ، روند اجرای اقدامات محدودیت و شلیک هرگونه محرک درج تعریف شده برای جدول را آغاز می کند.

هنگامی که یک تریگر به جای تعریف شده روی یک نما، عبارتی را در برابر نما اجرا می کند که معمولاً تریگر INSTTEAD OF را دوباره فعال می کند، به صورت بازگشتی فراخوانی نمی شود. درعوض، عبارت به عنوان اصلاحات در برابر جداول پایه زیر نمای حل می شود. در این حالت، تعریف view باید تمام محدودیت های یک نمای قابل به روزرسانی را داشته باشد. برای تعریف نماهای قابل به روز رسانی، به اصلاح داده ها از طریق نما مراجعه کنید.

به عنوان مثال، اگر یک ماشه به عنوان یک ماشه به جای به روز رسانی برای یک view تعریف شود. و، ماشه یک عبارت UPDATE را اجرا می کند که به همان نمای ارجاع می دهد، دستور UPDATE که توسط تریگر به جای ماشه راه اندازی شده است، دوباره ماشه را فراخوانی نمی کند. به روزرسانی راه اندازی شده توسط ماشه، به گونه ای پردازش می شود که گویی نمای به جای ماشه ای ندارد. ستون های تغییر یافته توسط UPDATE باید به یک جدول پایه منفرد حل شوند. هر تغییر در جدول پایه زیربنایی، زنجیره اعمال محدودیت ها و شلیک پس از تریگرهای تعریف شده برای جدول را آغاز می کند.

آزمایش برای به روزرسانی یا درج اقدامات در ستون های خاص

شما می توانید یک تریگر Transact-SQL برای انجام اقدامات خاصی بر اساس تغییرات به روز رسانی یا INSERT در ستون های خاص طراحی کنید. برای این منظور از UPDATE() یا COLUMNS_UPDATED در بدنه ماشه استفاده کنید. UPDATE() برای تلاش های UPDATE یا INSERT روی یک ستون آزمایش می کند. COLUMNS_UPDATED اقدامات UPDATE یا INSERT را که روی چندین ستون اجرا می شوند، آزمایش می کند. این تابع یک الگوی بیتی را برمی گرداند که نشان می دهد کدام ستون ها درج یا به روز شده اند.

محدودیت های ماشه

CREATE TRIGGER باید اولین عبارت در دسته باشد و فقط برای یک جدول اعمال شود.

یک ماشه فقط در پایگاه داده فعلی ایجاد می شود. با این حال، یک ماشه می تواند به اشیاء خارج از پایگاه داده فعلی ارجاع دهد.

اگر نام طرحواره ماشه برای واجد شرایط بودن تریگر مشخص شده است، نام جدول را به همین ترتیب واجد شرایط کنید.

یک اقدام ماشه را می توان برای بیش از یک اقدام کاربر (به عنوان مثال، INSERT و UPDATE) در همان دستور CREATE TRIGGER تعریف کرد.

به جای DELETE/UPDATE، تریگرها را نمی توان در جدولی تعریف کرد که دارای کلید خارجی با یک آبشار در اقدام DELETE/UPDATE تعریف شده است.

هر دستور SET را می توان در داخل یک تریگر مشخص کرد. گزینه SET انتخاب شده در طول اجرای تریگر به قوت خود باقی می ماند و سپس به تنظیمات قبلی خود باز می گردد.

هنگامی که یک ماشه آتش می گیرد ، دقیقاً مانند روشهای ذخیره شده ، نتایج به برنامه تماس بازگردانده می شوند. برای جلوگیری از بازگشت نتایج به دلیل شلیک ماشه ، یا جمله هایی را انتخاب نکنید که نتایج را برگردانند یا اظهاراتی که تکلیف متغیر را در یک ماشه انجام می دهند. ماشه ای که شامل یا جمله های انتخابی است که نتایج را به کاربر باز می گرداند یا بیانیه هایی که تکلیف متغیر را انجام می دهند ، نیاز به رسیدگی ویژه دارد. شما باید نتایج برگشتی را در هر برنامه ای بنویسید که در آن تغییرات در جدول ماشه مجاز باشد. اگر تکلیف متغیر باید در یک ماشه اتفاق بیفتد ، در ابتدای ماشه از یک عبارت nocount تنظیم شده استفاده کنید تا از بازگشت هر مجموعه نتیجه جلوگیری کنید.

اگرچه یک عبارت جدول کوتاه در واقع یک عبارت حذف است ، اما یک ماشه را فعال نمی کند زیرا این عمل حذف ردیف فردی را وارد نمی کند. با این حال ، فقط آن دسته از کاربران با مجوز برای اجرای یک بیانیه جدول کوتاه ، باید نگران این باشند که سهواً دور زدن یک ماشه حذف از این طریق باشد.

عبارت WritEtext ، چه وارد شده و چه بدون قفل ، یک ماشه را فعال نمی کند.

گفته های Transact-SQL زیر در یک ماشه DML مجاز نیست:

  • پایگاه داده را تغییر دهید
  • ایجاد پایگاه داده
  • پایگاه داده
  • پایگاه داده را بازیابی کنید
  • ورود به سیستم
  • دوباره پیکربندی کردن

علاوه بر این ، بیانیه های Transact-SQL زیر در هنگام استفاده از جدول یا نمای که هدف عمل تحریک است ، در بدن یک ماشه DML مجاز نیست.

  • ایجاد فهرست (از جمله ایجاد شاخص مکانی و ایجاد شاخص XML)
  • شاخص تغییر دهنده
  • شاخص افت
  • میز قطره
  • dbcc dbreindex
  • تابع پارتیشن را تغییر دهید
  • جدول را هنگام استفاده از موارد زیر تغییر دهید:
    • ستون ها را اضافه ، اصلاح یا رها کنید.
    • پارتیشن ها را تغییر دهید.
    • محدودیت های اصلی یا منحصر به فرد اصلی را اضافه یا رها کنید.

    از آنجا که SQL Server از محرک های تعریف شده توسط کاربر در جداول سیستم پشتیبانی نمی کند ، توصیه می کنیم محرک های تعریف شده توسط کاربر را در جداول سیستم ایجاد نکنید.

    بهینه سازی محرک های DML

    محرک ها در معاملات کار می کنند (ضمنی یا در غیر این صورت) و در حالی که باز هستند ، منابع را قفل می کنند. قفل تا زمان تأیید معامله (با تعهد) یا رد (با بازگشت) در جای خود باقی می ماند. هرچه ماشه طولانی تر باشد ، احتمال مسدود شدن فرآیند دیگر بیشتر می شود. بنابراین ، محرک ها را بنویسید تا مدت زمان ممکن خود را کاهش دهید. یکی از راه های دستیابی به مدت زمان کوتاه تر ، انتشار یک ماشه است که یک عبارت DML ردیف های صفر را تغییر می دهد.

    برای انتشار ماشه برای یک فرمان که هیچ ردیف را تغییر نمی دهد ، از متغیر سیستم RowCount_Big استفاده کنید.

    قطعه کد T-SQL زیر نحوه انتشار ماشه را برای یک دستور که هیچ ردیف را تغییر نمی دهد ، نشان می دهد. این کد باید در ابتدای هر ماشه DML وجود داشته باشد:

    اظهارات برای محرک های DDL

    محرک های DDL ، مانند محرک های استاندارد ، روش های ذخیره شده را در پاسخ به یک رویداد راه اندازی می کنند. اما ، بر خلاف محرک های استاندارد ، آنها در پاسخ به به روزرسانی ، درج یا حذف اظهارات روی یک جدول یا نمای اجرا نمی شوند. در عوض ، آنها در درجه اول در پاسخ به بیانیه های زبان تعریف داده (DDL) اجرا می شوند. انواع بیانیه شامل ایجاد ، تغییر ، افت ، کمک هزینه ، انکار ، ابطال و به روزرسانی است. برخی از روشهای ذخیره شده سیستم که عملیات DDL مانند را انجام می دهند نیز می توانند محرک های DDL را آتش بزنند.

    محرک های DDL خود را برای تعیین پاسخ های خود به اجرای روش ذخیره شده سیستم آزمایش کنید. به عنوان مثال ، عبارت Create Type و روشهای ذخیره شده SP_ADDTYPE و SP_RENAME ، ماشه DDL را که در یک رویداد Create_Type ایجاد شده است ، آتش می گیرند.

    برای اطلاعات بیشتر در مورد محرک های DDL ، به محرک های DDL مراجعه کنید.

    DDL در پاسخ به رویدادهایی که بر میزهای موقت محلی یا جهانی و روشهای ذخیره شده تأثیر می گذارد ، آتش نمی گیرند.

    بر خلاف محرک های DML ، محرک های DDL به طرحواره ها منتقل نمی شوند. بنابراین ، شما نمی توانید از توابع مانند Object_ID ، Object_Name ، ObjectProperty و ObjectPropertyex برای پرس و جو ابرداده در مورد محرک های DDL استفاده کنید. به جای آن از نماهای کاتالوگ استفاده کنید. برای اطلاعات بیشتر ، به اطلاعات مربوط به محرک های DDL مراجعه کنید.

    محرک های DDL با سرور در پوشه SQL Server Management Studio Object Explorer ظاهر می شوند. این پوشه در زیر پوشه Server Objects قرار دارد. محرک های DDL با پایگاه داده در پوشه محرک پایگاه داده ظاهر می شوند. این پوشه در زیر پوشه قابلیت برنامه پایگاه داده مربوطه قرار دارد.

    ورود به سیستم

    محرک های ورود به سیستم در پاسخ به یک رویداد ورود به سیستم روشهای ذخیره شده را انجام می دهند. این رویداد زمانی اتفاق می افتد که یک جلسه کاربر با نمونه ای از SQL Server ایجاد شود. ورود به سیستم باعث آتش سوزی پس از مرحله تأیید اعتبار در ورود به سیستم می شود ، اما قبل از تعیین جلسه کاربر. بنابراین ، تمام پیام های منشأ داخل ماشه که به طور معمول به کاربر می رسد ، مانند پیام های خطا و پیام های موجود از عبارت چاپ ، به ورود به سیستم خطای سرور SQL منحرف می شوند. برای اطلاعات بیشتر ، به Logon Triggers مراجعه کنید.

    در صورت عدم موفقیت احراز هویت ، باعث آتش سوزی نمی شوند.

    معاملات توزیع شده در یک ماشه ورود به سیستم پشتیبانی نمی شوند. خطای 3969 هنگامی که یک ماشه ورود به سیستم حاوی آتش معامله توزیع شده است ، برمی گردد.

    غیرفعال کردن ماشه ورود

    یک راه انداز ورود به سیستم می تواند به طور موثری از اتصال موفقیت آمیز به موتور پایگاه داده برای همه کاربران، از جمله اعضای نقش سرور ثابت sysadmin جلوگیری کند. هنگامی که یک راه انداز ورود به سیستم از اتصالات جلوگیری می کند، اعضای نقش سرور ثابت sysadmin می توانند با استفاده از اتصال سرپرست اختصاصی، یا با راه اندازی موتور پایگاه داده در حالت پیکربندی حداقل (-f) متصل شوند. برای اطلاعات بیشتر، به گزینه های راه اندازی سرویس موتور پایگاه داده مراجعه کنید.

    ملاحظات ماشه عمومی

    بازگرداندن نتایج

    توانایی برگرداندن نتایج از تریگرها در نسخه بعدی SQL Server حذف خواهد شد. محرک هایی که مجموعه نتایج را برمی گرداند ممکن است باعث رفتار غیرمنتظره در برنامه هایی شود که برای کار با آنها طراحی نشده اند. از بازگرداندن مجموعه های نتایج از محرک ها در کار توسعه جدید خودداری کنید و برنامه ریزی کنید تا برنامه هایی را که در حال حاضر انجام می دهند اصلاح کنید. برای جلوگیری از بازگرداندن مجموعه های نتایج محرک ها، گزینه Disallow results from triggers را روی ۱ تنظیم کنید.

    راه اندازهای ورود همیشه بازگشت مجموعه های نتایج را ممنوع می کنند و این رفتار قابل تنظیم نیست. اگر یک ماشه ورود به سیستم یک مجموعه نتیجه ایجاد کند، ماشه راه اندازی نمی شود و تلاش برای ورود به سیستم که ماشه را فعال کرده است رد می شود.

    محرک های متعدد

    SQL Server به شما امکان می دهد برای هر رویداد DML، DDL یا LOGON چندین تریگر ایجاد کنید. برای مثال، اگر CREATE TRIGGER FOR UPDATE برای جدولی اجرا شود که از قبل دارای یک راه انداز به روزرسانی است، یک راه انداز به روزرسانی اضافی ایجاد می شود. در نسخه های قبلی SQL Server، تنها یک راه انداز برای هر رویداد تغییر داده INSERT، UPDATE، یا DELETE برای هر جدول مجاز است.

    محرک های بازگشتی

    هنگامی که تنظیم RECURSIVE_TRIGGERS با استفاده از ALTER DATABASE فعال باشد، SQL Server از فراخوانی بازگشتی تریگرها نیز پشتیبانی می کند.

    تریگرهای بازگشتی انواع زیر را فعال می کنند:

    با بازگشت غیر مستقیم، یک برنامه کاربردی جدول T1 را به روز می کند. این آتش سوزی TR1 را آغاز می کند، جدول T2 را به روز می کند. سپس T2 را فعال کرده و جدول T1 را به روز می کند.

    در بازگشت مستقیم، برنامه جدول T1 را به روز می کند. این آتش سوزی TR1 را آغاز می کند، جدول T1 را به روز می کند. از آنجایی که جدول T1 به روز شد، دوباره TR1 را فعال کنید و غیره.

    مثال زیر از بازگشت تریگر غیرمستقیم و مستقیم استفاده می کند. فرض کنید که دو محرک به روز رسانی، TR1 و TR2، در جدول T1 تعریف شده اند. TR1 جدول T1 را به صورت بازگشتی به روز می کند. یک دستور UPDATE هر TR1 و TR2 را یک بار اجرا می کند. علاوه بر این، راه اندازی TR1 باعث اجرای TR1 (به صورت بازگشتی) و TR2 می شود. جداول درج شده و حذف شده برای یک تریگر خاص حاوی ردیف هایی هستند که فقط با عبارت UPDATE مطابقت دارند که تریگر را فراخوانی کرده است.

    رفتار قبلی فقط در صورتی رخ می دهد که تنظیم RECURSIVE_TRIGGERS با استفاده از ALTER DATABASE فعال شود. هیچ ترتیب مشخصی وجود ندارد که در آن چندین تریگر تعریف شده برای یک رویداد خاص اجرا شوند. هر محرک باید خودکفا باشد.

    غیرفعال کردن تنظیم RECURSIVE_TRIGGERS فقط از بازگشت مستقیم جلوگیری می کند. برای غیرفعال کردن بازگشت غیرمستقیم نیز، با استفاده از sp_configure، گزینه سرور تریگرهای تودرتو را روی 0 تنظیم کنید.

    اگر هر یک از تریگرها، بدون در نظر گرفتن سطح تودرتو، تراکنش بازگشتی را انجام دهد، دیگر ماشه ای اجرا نمی شود.

    ماشه های تودرتو

    می توانید ماشه ها را حداکثر تا 32 سطح قرار دهید. اگر یک ماشه جدولی را تغییر دهد که در آن یک ماشه دیگر وجود دارد، تریگر دوم فعال می شود و سپس می تواند یک ماشه سوم را فراخوانی کند و غیره. اگر هر یک از ماشه ها در زنجیره یک حلقه بی نهایت ایجاد کند، از سطح تودرتو فراتر رفته و ماشه لغو می شود. هنگامی که یک تریگر Transact-SQL کد مدیریت شده را با ارجاع به روال، نوع یا جمع CLR راه اندازی می کند، این مرجع به عنوان یک سطح در برابر محدودیت 32 سطحی تودرتو به حساب می آید. روش هایی که از داخل کد مدیریت شده فراخوانی می شوند در این محدودیت حساب نمی شوند.

    برای غیرفعال کردن تریگرهای تودرتو، گزینه تریگرهای تودرتو در sp_configure را روی 0 (خاموش) قرار دهید. پیکربندی پیش فرض از تریگرهای تودرتو پشتیبانی می کند. اگر محرک های تودرتو خاموش باشند، با وجود تنظیم RECURSIVE_TRIGGERS که با استفاده از ALTER DATABASE تنظیم شده است، محرک های بازگشتی نیز غیرفعال می شوند.

    اولین تریگر AFTER که در داخل یک تریگر جای گرفته است، حتی اگر گزینه پیکربندی سرور محرک های تودرتو 0 باشد، فعال می شود. اما، تحت این تنظیم، تریگرهای بعدی AFTER فعال نمی شوند. هنگامی که گزینه پیکربندی سرور محرک های تودرتو روی 0 تنظیم شده است، برنامه های خود را برای تریگرهای تودرتو بررسی کنید تا مشخص کنید آیا برنامه ها از قوانین تجاری شما پیروی می کنند.

    قطعنامه نام معوق

    SQL Server اجازه می دهد تا رویه ها، تریگرها و دسته های ذخیره شده Transact-SQL به جداولی که در زمان کامپایل وجود ندارند ارجاع دهند. به این قابلیت تفکیک نام معوق می گویند.

    مجوزها

    برای ایجاد یک ماشه DML ، نیاز به تغییر مجوز در جدول یا نمای ایجاد شده در مورد ماشه دارد.

    برای ایجاد یک ماشه DDL با دامنه سرور (در تمام سرور) یا یک ماشه ورود به سیستم ، به مجوز سرور کنترل روی سرور نیاز دارد. برای ایجاد یک ماشه DDL با دامنه پایگاه داده (در پایگاه داده) ، نیاز به تغییر هرگونه مجوز محرک DDL در پایگاه داده فعلی دارد.

    مثال ها

    الف) با استفاده از ماشه DML با یک پیام یادآوری

    محرک DML زیر وقتی کسی سعی می کند داده ها را در جدول مشتری در پایگاه داده AdventureWorks2019 اضافه یا تغییر دهد ، پیامی را به مشتری چاپ می کند.

    ب-استفاده از ماشه DML با پیام ایمیل یادآوری

    مثال زیر هنگام تغییر جدول مشتری ، پیام ایمیل را به شخص مشخص (MARYM) ارسال می کند.

    ج - استفاده از DML پس از ماشه برای اجرای یک قانون تجاری بین میزهای خریدار و جداول فروشنده

    از آنجا که محدودیت ها فقط به ستون هایی که در سطح ستون یا محدودیت سطح جدول تعریف شده است ، مرجع است ، شما باید هر محدودیت جدول را تعریف کنید (در این حالت ، قوانین تجاری) را به عنوان محرک تعریف کنید.

    مثال زیر یک ماشه DML در پایگاه داده AdventureWorks2012 ایجاد می کند. این محرک برای اطمینان از اینکه رتبه اعتباری برای فروشنده خوب است (نه 5) در هنگام تلاش برای وارد کردن سفارش خرید جدید در جدول خرید. برای به دست آوردن رتبه اعتباری فروشنده ، باید به جدول فروشنده ارجاع شود. اگر رتبه اعتباری خیلی کم باشد ، پیام ظاهر می شود و درج اتفاق نمی افتد.

    D. با استفاده از یک ماشه DDL با پایگاه داده

    مثال زیر از یک ماشه DDL برای جلوگیری از کاهش هرگونه مترادف در یک پایگاه داده استفاده می کند.

    E. با استفاده از یک ماشه DDL با سرور سرور

    مثال زیر از یک ماشه DDL برای چاپ یک پیام استفاده می کند در صورت وقوع هر رویداد ایجاد پایگاه داده در نمونه سرور فعلی ، و از عملکرد EventData برای بازیابی متن عبارت مربوط به Transact-SQL استفاده می کند. برای مثال های بیشتر که از EventData در محرک های DDL استفاده می کنند ، به عملکرد EventData مراجعه کنید.

    اعمال می شود: SQL Server 2008 (10. 0. x) و بعد.

    F. با استفاده از ماشه ورود

    مثال Trigger Logon Trigger تلاش برای ورود به SQL Server را به عنوان عضو ورود به سیستم login_test در صورت وجود سه جلسه کاربر در زیر آن ورود ، انکار می کند.

    اعمال می شود: SQL Server 2008 (10. 0. x) و بعد.

    G. مشاهده حوادثی که باعث آتش سوزی می شوند

    مثال زیر از نمایشگاه های sys. triggers و sys. trigger_events استفاده می کند تا مشخص کند که وقایع زبانی Transact-SQL باعث ایجاد ایمنی در آتش می شود. ماشه ، ایمنی ، در مثال "D" ایجاد شده است ، که در بالا یافت می شود.

سیگنالهای معاملاتی...
ما را در سایت سیگنالهای معاملاتی دنبال می کنید

برچسب : نویسنده : عارف لرستانی بازدید : <-PostHit-> تاريخ : جمعه 25 فروردين 1402 ساعت: 15:19