انواع محرک ها چیست؟

ساخت وبلاگ

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

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

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

هنگامی که یک تابع ماشه مناسب ایجاد شد، ماشه با CREATE TRIGGER ایجاد می شود. همان تابع ماشه را می توان برای چندین تریگر استفاده کرد.

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

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

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

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

اگر یک INSERT حاوی یک بند ON CONFLICT DO UPDATE باشد، ممکن است اثرات محرک های سطح ردیف قبل از درج و محرک های سطح ردیف BEFORE UPDATE هر دو به گونه ای اعمال شوند که از وضعیت نهایی ردیف به روز شده آشکار باشد. اگر به یک ستون EXCLUDED ارجاع داده شود. با این حال، لازم نیست یک مرجع ستون EXCLUDED برای هر دو مجموعه از سطح ردیف قبل از اجرا وجود داشته باشد. احتمال نتایج غافلگیرکننده زمانی باید در نظر گرفته شود که محرک های سطح ردیف قبل از درج و قبل از به روزرسانی وجود داشته باشند که یک ردیف در حال درج/به روزرسانی را تغییر می دهند (این می تواند مشکل ساز باشد حتی اگر اصلاحات کم و بیش معادل باشند، اگر هم نباشند. ناتوان). توجه داشته باشید که راه اندازهای UPDATE در سطح بیانیه زمانی اجرا می شوند که ON CONFLICT DO UPDATE مشخص شده باشد، صرف نظر از اینکه آیا هیچ ردیفی تحت تأثیر UPDATE قرار گرفته است یا خیر (و بدون توجه به اینکه آیا مسیر جایگزین UPDATE تا کنون طی شده است). یک INSERT با عبارت ON CONFLICT DO UPDATE ابتدا راه اندازهای قبل از INSERT، سطح بیانیه را اجرا می کند، سپس راه اندازهای قبل از به روزرسانی در سطح بیانیه، و پس از آن محرک های بعد از به روزرسانی در سطح بیانیه و در نهایت راه اندازهای AFTER INSERT در سطح بیانیه را اجرا می کند.

اگر یک به روز رسانی در یک جدول پارتیشن بندی شده باعث شود یک ردیف به پارتیشن دیگر منتقل شود، به عنوان یک DELETE از پارتیشن اصلی و سپس یک INSERT در پارتیشن جدید انجام می شود. در این حالت، تمام تریگرهای سطح ردیف قبل از به روز رسانی و همه محرک های سطح ردیف قبل از حذف بر روی پارتیشن اصلی فعال می شوند. سپس تمام تریگرهای سطح ردیف BEFORE INSERT روی پارتیشن مقصد فعال می شوند. زمانی که همه این محرک ها روی ردیف در حال جابجایی تأثیر می گذارند، باید احتمال نتایج شگفت انگیز در نظر گرفته شود. تا آنجا که به ماشه های AFTER ROW مربوط می شود، AFTER DELETE و AFTER INSERT تریگرها اعمال می شوند. اما راه اندازهای AFTER UPDATE اعمال نمی شوند زیرا UPDATE به DELETE و INSERT تبدیل شده است. تا آنجا که به ماشه های سطح بیانیه مربوط می شود، هیچ یک از محرک های DELETE یا INSERT فعال نمی شوند، حتی اگر حرکت ردیف رخ دهد. فقط تریگرهای UPDATE تعریف شده در جدول هدف مورد استفاده در دستور UPDATE فعال می شوند.

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

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

توابع ماشه ای که توسط محرک های هر استحکام فراخوانی شده است ، همیشه باید تهی بازگردند. توابع Trigger که توسط محرک های هر ردیف فراخوانی شده است می توانند در صورت انتخاب ، یک ردیف جدول (مقدار نوع Heappuple) را به مجری فراخوان برگردانند. یک ماشه سطح ردیف قبل از عملیات اخراج شده است:

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

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

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

یک سطح ردیف به جای Trigger یا باید NULL را برگرداند تا نشان دهد که هیچ داده ای از جداول پایه زیر نظر را تغییر نمی دهد ، یا باید ردیف نمای را که در آن منتقل شده است برگرداند (ردیف جدید برای درج و به روزرسانی عملیات یا به روزرسانی یا به روزرسانیردیف قدیمی برای حذف عملیات). از مقدار بازگشت غیر نت برای نشان دادن اینكه ماشه اصلاحات داده لازم را در نمای انجام می دهد ، استفاده می شود. این باعث می شود تعداد ردیف های تحت تأثیر فرمان افزایش یابد. فقط برای عملیات درج و به روزرسانی ، ماشه ممکن است قبل از بازگشت آن ردیف جدید را تغییر دهد. این داده های برگشتی را با بازگشت یا بازگشت به روزرسانی درج تغییر می دهد و وقتی نمایش دقیقاً همان داده های ارائه شده را نشان نمی دهد ، مفید است.

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

برخی از ملاحظات برای ستون های تولید شده اعمال می شود. ستون های تولید شده پس از محرک و بعد از محرک ها محاسبه می شوند. بنابراین ، مقدار تولید شده را می توان پس از محرک ها بازرسی کرد. در قبل از محرک ها ، ردیف قدیمی حاوی مقدار تولید شده قدیمی است ، همانطور که انتظار می رود ، اما ردیف جدید هنوز حاوی مقدار تولید شده جدید نیست و نباید به آن دسترسی پیدا کرد. در رابط زبان C ، محتوای ستون در این مرحله تعریف نشده است. یک زبان برنامه نویسی سطح بالاتر باید از دسترسی به ستون تولید شده در ردیف جدید در A قبل از ماشه جلوگیری کند. تغییر در مقدار یک ستون تولید شده در A قبل از ماشه نادیده گرفته می شود و رونویسی می شود.

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

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

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

اگر یک تابع تریگر دستورات SQL را اجرا کند، این دستورات ممکن است دوباره تریگرها را اجرا کنند. این به عنوان محرک های آبشاری شناخته می شود. هیچ محدودیت مستقیمی در تعداد سطوح آبشاری وجود ندارد. این امکان وجود دارد که آبشارها باعث فراخوانی بازگشتی از همان ماشه شوند. به عنوان مثال، یک ماشه INSERT ممکن است دستوری را اجرا کند که یک ردیف اضافی را در همان جدول قرار می دهد و باعث می شود که ماشه INSERT دوباره فعال شود. این وظیفه برنامه نویس ماشه است که در چنین سناریوهایی از بازگشت بی نهایت اجتناب کند.

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

هر زبان برنامه نویسی که از تریگرها پشتیبانی می کند روش خاص خود را برای در دسترس قرار دادن داده های ورودی ماشه برای تابع ماشه دارد. این داده های ورودی شامل نوع رویداد راه اندازی (به عنوان مثال، INSERT یا UPDATE) و همچنین هر آرگومان هایی است که در CREATE TRIGGER فهرست شده اند. برای یک راه انداز در سطح ردیف، داده های ورودی همچنین شامل ردیف NEW برای راه اندازهای INSERT و UPDATE، و/یا ردیف قدیمی برای راه اندازهای UPDATE و DELETE هستند.

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

قبلی Up بعد
فصل 39. محرک ها صفحه اصلی 39. 2. مشاهده تغییرات داده ها

تصحیح را ارسال کنید

اگر چیزی در مستندات می بینید که صحیح نیست، با تجربه شما با ویژگی خاص مطابقت ندارد یا نیاز به توضیح بیشتر دارد، لطفاً از این فرم برای گزارش یک مشکل مستند استفاده کنید.

نرم افزار مفید تریدر...
ما را در سایت نرم افزار مفید تریدر دنبال می کنید

برچسب : نویسنده : احمد شاملو بازدید : 65 تاريخ : چهارشنبه 23 فروردين 1402 ساعت: 18:48