بخشی از پاورپوینت
--- پاورپوینت شامل تصاویر میباشد ----
اسلاید 1 :
Trigger ها روالهایی هستند که پس از رخ دادن یک رویداد خاص به صورت خودکار اجرا می شوند .
انواع :
DDL Trigger
هنگامی اجرا می شوند ، که رویدادی سبب ایجاد تغییر در ساختار بانک اطلاعاتی یا اشیا در بانک اطلاعاتی شود .
DML Trigger
در هنگام رخ دادن دستورات DML ،(Insert , Update , Delete) روی جداول و Viewها اجرا می شوند .
اسلاید 2 :
After Trigger
بعد از اجرای دستورات Insert ، Update و Delete روال مربوطه اجرا مي شود .
Instead Of Trigger
به جای دستور Insert ، Update و Delete اجرا مي شود .
اسلاید 3 :
اعمال محدودیت های جامعیتی در جایی که Constraint ها کارایی لازم را ندارند .
درج رکوردها در جدول Log
به هنگام سازی نسخه های مختلف داده
اعمال قواعد پیچیده فعالیتهای محیط کاری
اطلاع دادن به سایر برنامه هایی که تغییری در داده های جدول اتفاق افتاده است .
و ...
اسلاید 4 :
Create [OR Replace] Trigger Trigger_name
Before|After |nstead Of Insert|Update|Delete
[OF column_name, column_name, …..]
ON table_name
[FOR EACH ROW]
[WHEN condition ]
Begin
-- Statements here
End ;
مواردی که در SQL Server وجود ندارد با رنگ قرمز مشخص شده است. این موارد به شکل دیگری در SQL Server قابل پیاده سازی می باشد.
اسلاید 5 :
UPDATE ( column )
از این تابع برای تست اینکه آیا یک ستون از جدول در دستور Insert یا Update آورده شده است یا خیر استفاده می شود .
نکته : این تابع مشخص نمی کند که آیا مقدار ستون واقعا تغییر کرده است یا خیر .
مثال در query زیر
UPDATE customer SET City = City
مقدار با وجود اینکه مقدار City تغییر نکرده تابع Update(City) مقدار True را برمی گرداند . چون ستون City در دستور UPDATE ظاهر شده است .
اسلاید 6 :
در صورتی که تنظیم مربوط به RECURSIVE_TRIGGERS فعال باشد Trigger ها به صورت بازگشتی فراخوانی می شوند :
مثال
.1بر روی جدول T1 یک Update انجام می شود
.2Trigger با نام TR1 فعال می شود این Trigger یک Update بر روی جدول T2 انجام می دهد .
.3بر روی جدول T2 یک Trigger با نام TR2 وجود دارد که جدول T1 را Update می کند . در این حالت اجرای بازگشتی رخ داده است .
اسلاید 7 :
CREATE TRIGGER employee_insupd
ON employee
FOR INSERT, UPDATE
AS
DECLARE
@min_lvltinyint, @max_lvltinyint, @emp_lvltinyint, @job_idsmallint
SELECT
@min_lvl = j.min_lvl,
@max_lvl = j.max_lvl,
@emp_lvl = i.job_lvl,
@job_id = i.job_id
FROM employee e
INNER JOIN inserted i
ON e.emp_id = i.emp_id
JOIN jobs j
ON j.job_id = i.job_id
IF NOT (@emp_lvl BETWEEN @min_lvl AND @max_lvl)
BEGIN
RAISERROR ('The level for job_id:%d should be between %d and %d.', 16, 1, @job_id, @min_lvl, @max_lvl)
ROLLBACK TRANSACTION
END