فرض کنید ما بعد از ارزیابی مجدد ، علائم موجود در پایگاه داده دانشجویی را برای برخی از دانشجویان به روز می کنیم. وقتی علائم را به روز می کنیم ، مقادیر قدیمی آنها از بین می رود. اما به طور کلی بهتر است که علائم قدیمی را نیز حفظ کنیم - فقط بدانیم که این علامت قبل از چه چیزی بوده و اکنون چیست. اما ما هیچ ستونی برای ذخیره علائم قدیمی در جدول Marks نداریم. ما باید یک جدول جداگانه برای ذخیره گزارش به روزرسانی برای به روزرسانی های مارک داشته باشیم. اما این کار را نمی توان در به روزرسانی جدول Single Marks انجام داد. در این حالت ، ما باید جدول Marks را به روز کنیم و همچنین باید ورودی را در جدول MARKS_LOG وارد کنیم. هر دو معاملات مختلف هستند.
در این مورد چه کاری می تواند انجام شود؟ما می توانیم روشی را برای به روزرسانی و درج بنویسیم و هر بار که مجبوریم علائم را به روز کنیم ، آن را صدا کنیم. اما هدف اصلی شخصی که در حال به روزرسانی مارک است ، فقط به روزرسانی علائم است. اما قرار دادن در جدول ورود به سیستم برای او ثانویه است یا برای او کم اهمیت است ، اما در همین حال ذخیره آن اطلاعات در جایی مهم است. بنابراین او فقط از عبارت به روزرسانی برای اصلاح علائم استفاده خواهد کرد. در چنین حالتی از محرک ها برای وارد کردن رکورد در پرونده های log استفاده می شود.
محرک ها بلوک های کد PL / SQL هستند که در نتیجه هرگونه درج / به روزرسانی / حذف در جدول اجرا می شوند. هیچ فراخوانی صریح برای محرک ها وجود نخواهد داشت. همیشه به طور خودکار اجرا می شود. این ممکن است یک پرس و جو یا مجموعه ای از نمایش داده ها را برای رسیدن به هدف انجام دهد. اما همیشه به عنوان بلوک PL/SQL نوشته خواهد شد. همیشه با درج / به روزرسانی / حذف یک جدول همراه است. اما مجموعه معامله در داخل ماشه را می توان در همان جدول یا یک یا چند جدول دیگر انجام داد.
نحو کلی یک ماشه به شرح زیر است:
یک ماشه معمولی دارای 3 مؤلفه اصلی است
- تحریک بیانیه SQL: - این عبارت DML است که باعث می شود محرک ها فراخوانی شوند. این است که می گوید چه موقع با ماشه تماس بگیرید - قبل یا بعد از آن ، کدام بیانیه DML جدول - درج/ به روزرسانی/ حذف و اینکه آیا هنگام پردازش کامل جدول یا فقط چند ستون پردازش می شود ، با ماشه تماس بگیرید. قبل و بعد از آن در جداول استفاده می شود و به جای آن در نمای برای ایجاد محرک ها استفاده می شود. به عنوان مثال ، می گوید چه موقع با ماشه تماس بگیرید تا سیاههها را وارد کنید - خواه آن را در وارد کردن ، حذف یا به روزرسانی جدول Marks ، قبل یا بعد از به روزرسانی جدول Marks ، خواه برای تماس با Trigger در به روزرسانی تمام ستون های جدول Marks یا ON تماس بگیرید. ستونهای خاص از جدول.
- محدودیت ماشه: - این بخشی از ماشه است که می گوید چند بار ماشه باید اجرا شود. اگر ماشه باید برای هر ردیف فراخوانی شود، /update/delete یا فقط یک بار برای تراکنش فراخوانی شود. در مثال ما، برای هر ردیف خواهد بود، زیرا، ما باید برای هر ردیف از به روزرسانی نمره های دانش آموز لاگ داشته باشیم. مواردی وجود دارد که اگر برخی از دستورات DML را روی میز انجام دهیم، می گوییم اولین و آخرین ورودی تراکنش روز در صورتحساب سوپرمارکت در جدول دیگری ثبت شود. در این حالت، هر INSERT تریگر را فراخوانی نمی کند، در عوض فقط دو بار در روز برای ثبت ورودی تماس می گیرد.
- Trigger Action: - این بخش در واقع مجموعه ای از تراکنش ها را در نتیجه بیانیه اصلی DML انجام می دهد. به عنوان مثال، درج رکوردها در جداول گزارش. نیازی نیست همیشه لاگ درج شود. می تواند هر معامله ای باشد. برای مثال، زمانی که تاریخ تولد یک دانش آموز درج می شود، ماشه ممکن است سن او را محاسبه کرده و در همان جدول درج کند.
ایجاد یا جایگزینی) VALUES (:old. std_id,:old. subject, :old. sub_mark, :new. sub_mark); EXCEPTION When OTHERS THEN raise_application_error (-20015, 'Error while inserting marks log'); پایان؛
انواع محرک ها
دو نوع محرک وجود دارد.
- تریگر سطح ردیف: هنگامی که هر سطر از جدول درج/به روز/حذف شود، ماشه سطح ردیف اجرا می شود. اگر یک تریگر سطح ردیف باشد، باید در هنگام ایجاد تریگر به صراحت مشخص کنیم، همانطور که در مثال بالا انجام دادیم. همچنین، باید WHEN (شرط) را در ماشه مشخص کنیم.
- ماشه سطح بیانیه: - این تریگر فقط یک بار برای دستور DML اجرا می شود. این دستور DML ممکن است یک سطر یا چند سطر یا کل جدول را درج/حذف/به روز کند. صرف نظر از تعداد ردیف ها، این ماشه برای دستور فعال می شود. اگر در حین ایجاد نوع تریگر را مشخص نکرده باشیم، به طور پیش فرض یک ماشه سطح بیانیه خواهد بود.
در مثال زیر، هنگامی که Student ها درج می شوند، سن دانش آموز را محاسبه می کند و جدول STUDENT را به روز می کند.
ایجاد یا جایگزینی tr_calc_age پس از درج در دانش آموز شروع به روز رسانی STUDENT s SET AGE = SYSDATE s. DATE_OF_BIRTH WHERE s. STD_ID =:old. STD_ID; EXCEPTION When OTHERS THEN raise_application_error (-20015, 'Error while inserting marks log'); پایان؛
در هر دو مورد ، عبارت DML ممکن است در ستون (ها) خاص یا در جدول کامل باشد.
علاوه بر انواع فوق العاده ماشه ، می توانیم محرک هایی داشته باشیم که به دلیل زمان اعدام آنها چنین خوانده می شوند.
- قبل از ماشه: - این ماشه قبل از اجرای بیانیه DML فراخوانی می شود. این قبل از ماشه می تواند برای برخی از شرایط بررسی استفاده شود یا می توان از آن برای تغییر کل بیانیه DML استفاده کرد تا در جدول قابل اجرا نباشد. به عنوان مثال ، اگر سن دانشجویی کمتر از 10 است ، اجازه ندهید که رکورد را در جدول وارد کنید.
- پس از ماشه: - این ماشه پس از اجرای بیانیه DML فراخوانی می شود. این می تواند هر نوع معامله را انجام دهد.
- ترکیبی از محرک ها: - ما می توانیم ترکیبی از ردیف ، بیانیه ، قبل و بعد از محرک ها داشته باشیم.
- قبل از بیانیه: - این ماشه فقط یک بار قبل از اجرای بیانیه DML اجرا می شود.
- قبل از ردیف: - این ماشه برای هر ردیف جدول اجرا می شود ، اما قبل از اجرای DML.
- پس از بیانیه:- این ماشه فقط یک بار پس از اتمام اجرای DML اجرا می شود
- بعد از ردیف: - این ماشه پس از اتمام بیانیه DML اجرا می شود ، اما برای هر ردیف جدول.
برخی از نکات کلیدی در مورد ماشه
- محرک ها در آنها تعهد یا بازپرداخت یا بازپرداخت ندارند. تمام تعهدات و بازگشت در بیانیه اصلی DML ذکر شده است. اگر معامله DML انجام شود یا به عقب برگردد ، معامله در ماشه نیز انجام می شود یا به عقب برگردانده می شود. این امر به این دلیل است که اگر در ماشه تعهد یا بازپرداخت کنیم ، اظهارات DML را نیز مرتکب یا بازگرداند. اما این مطلوب نیست ، زیرا محرک ها برای انجام معامله در نتیجه اظهارات DML هستند. هدف آن تأیید معامله DML نیست ، بلکه انجام معامله اضافی به عنوان بخشی از بیانیه DML است.
- نه: مقادیر قدیمی در محرک های درج از آنجا که کاملاً یک رکورد جدید است.
- نه: مقادیر جدید در حذف محرک ها ، زیرا ما در حال حذف رکورد هستیم.
- اگر چندین محرک در جدول تعریف شده باشد ، معیار خاصی برای اجرای آنها وجود ندارد. همه آنها می توانند به طور همزمان انجام دهند. از این رو ممکن است مجبور شویم ماشه دیگری برای اجرای همه این محرک ها به ترتیب داشته باشیم.
- یک ماشه نمی تواند جدول را که از آن خوانده شده است تغییر دهد. اگر ماشه ای به عنوان نتیجه درج روی یک جدول وجود داشته باشد ، ماشه نمی تواند همان جدول را وارد و به روز کند. این امر به این دلیل است که ما قبلاً قفل روی میز داریم و وضعیت قفل مرده را ایجاد می کند.
دستور اعدام
- قبل از اینکه ماشه بیانیه همیشه اول خوانده شود. قبل از اجرای کل بیانیه DML و تأثیرگذاری بر جدول خوانده می شود.
- قبل از اینکه ماشه سطح ردیف برای هر سطر فراخوانی شود.
- پس از اجرای بیانیه DML ، پس از اینکه ماشه سطح ردیف برای هر ردیف جدول فراخوانی می شود.
- در پایان ، بعد از محرک سطح بیانیه فراخوانی می شود.
توجه: این ترتیب است که در آن ماشه منفرد با انواع مختلف اجرا می شود.
میزهای جهش دهنده
فرض کنید ما برخی از سوابق را در جدول دانشجویی قرار داده ایم. ما یک ماشه سطح ردیف را در همان جدول ایجاد کرده ایم تا تعداد کل سوابق را پس از درج محاسبه کنیم. در این شرایط چه مشکلی دارد؟عالی به نظر می رسد درست است؟اما خطای جدول جهش یافته را به وجود می آورد. آنچه در این مورد اتفاق می افتد این است که جدول دانشجویی با سوابق درج شده است. ماشه سطح ردیف پس از هر درج ردیف شلیک می شود. اما معامله روی دانش آموز هنوز کامل نیست و ماشه در تلاش است تا به دانشجویان دسترسی پیدا کند. قفل درج در دانش آموز وجود خواهد داشت که برای انتخاب شمارش برای ماشه منتشر نمی شود. از این رو ماشه منتظر تکمیل درج خواهد بود. اما درج منتظر تکمیل ماشه برای انجام درج ردیف بعدی یا تکمیل معامله است. از این رو هر دو منتظر هستند تا یکدیگر را تکمیل کنند. چنین شرایطی در جدول خطای جهش نامیده می شود.
به همین ترتیب ، اگر دو جدول A و B وجود داشته باشد ، و دو محرک که یکی از ماشه ها در هنگام قرار دادن در A قرار می گیرند ، جدول B را به روز می کند و یک ماشه دیگر در هنگام بروزرسانی در B. در جدول A قرار می دهد. هر دو میز منتظر یکدیگر خواهند بود. این همچنین شرط دیگری از جداول جهش است. این نوعی وضعیت بن بست است که از محرک ها استفاده می شود.
راه حل برای جداول جهش یافته
- از محرک ها خودداری کنید: - محرک ها توسط کاربران فراخوانی نمی شوند. آنها به طور ضمنی توسط اظهارات DML خوانده می شوند. از این رو ما کنترل محرک ها را نخواهیم داشت. علاوه بر این ، چندین محرک در همان جدول وجود خواهد داشت که با یکدیگر در تضاد خواهد بود که منجر به جهش می شود. از این رو بهتر است تا حد امکان از آنها استفاده نکنید.
- استفاده از بعد یا به جای محرک ها از جهش جلوگیری می کند. اگر ما از Trigger استفاده می کنیم ، پس از اتمام معامله DML اجرا می شود. از این رو قفل روی میز آزاد می شد. اگر ما به جای Trigger از آن استفاده می کنیم ، معامله DML را خنثی می کند و سپس معامله ماشه را انجام می دهد. از این رو هیچ جهش وجود نخواهد داشت.
- سعی کنید از معامله DML در همان جدول تماس در محرک ها جلوگیری کنید. این هیچ قفل روی میز ایجاد نمی کند و از این رو هیچ جهش وجود ندارد.

پستهای اخیر
- سوالات مصاحبه zenefits
- تجربه مصاحبه zenefits
- س questions الات مصاحبه
- تجربه مصاحبه آرزو
- سوالات مصاحبه Tableau
- سوالات مصاحبه الگوریتم
- سوالات مصاحبه آرایه
- آموزش برنامه نویسی ج
- آموزش C ++
- آموزش DBMS
- آموزش الکترونیک دیجیتال
- سوالات مصاحبه برنامه نویسی پویا
- آموزش گیت
- سوالات مصاحبه نمودار
- سوالات مصاحبه هذیان
- تجربه مصاحبه
- سوالات مصاحبه
- آموزش جاوا
- آموزش جاوا اسکریپت
- راه حل های کتی
- سوالات مصاحبه LinkedList
- سوالات مصاحبه ماتریس
- آموزش PHP
- اصول اولیه
- سوالات مصاحبه صف
- آموزش برنامه نویسی R
- آموزش سلنیوم
- مرتب سازی سوالات مصاحبه
- آموزش بوت بهار
- سوالات مصاحبه SQL
- آموزش SQL
- سوالات مصاحبه پشته
- سوالات مصاحبه رشته ای
- سوالات مصاحبه فنی
- آموزش تست
- سوالات مصاحبه درخت
- انواع تست
- دستهبندی نشده
- اری
استراتژی برای تجارت گزینه های...
ما را در سایت استراتژی برای تجارت گزینه های دنبال می کنید
برچسب :
نویسنده : فریبا کامران
بازدید : 34
تاريخ : پنجشنبه
26 مرداد
1402 ساعت: 16:13