1
2
trigger
در
SQL Server 2008
تعریف و انواع Trigger
Trigger ها روالهایی هستند که پس از رخ دادن یک رویداد خاص به صورت خودکار اجرا می شوند .
انواع :
DDL Trigger
هنگامی اجرا می شوند ، که رویدادی سبب ایجاد تغییر در ساختار بانک اطلاعاتی یا اشیا در بانک اطلاعاتی شود .
DML Trigger
در هنگام رخ دادن دستورات DML ،(Insert , Update , Delete) روی جداول و View ها اجرا می شوند .
3
انواع DML Trigger
After Trigger
بعد از اجرای دستورات Insert ، Update و Delete روال مربوطه اجرا می شود .
Instead Of Trigger
به جای دستور Insert ، Update و Delete اجرا می شود .
4
کاربردهای Trigger
اعمال محدودیت های جامعیتی در جایی که Constraint ها کارایی لازم را ندارند .
درج رکوردها در جدول Log
به هنگام سازی نسخه های مختلف داده
اعمال قواعد پیچیده فعالیتهای محیط کاری
اطلاع دادن به سایر برنامه هایی که تغییری در داده های جدول اتفاق افتاده است .
و …
5
Syntax کلی Trigger
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 قابل پیاده سازی می باشد.
6
Syntax در SQL Server
CREATE TRIGGER schema_name.trigger_name
ON ( table | view )
( FOR | AFTER | INSTEAD OF )
{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] }
AS
{ sql_statement [ ; ] [ …n ] }
7
جداول Inserted و deleted در SQLServer
از دو جدول Inserted و Deleted برای دسترسی به رکوردهایی که تحت تاثیر قرار گرفته اند ، می توان استفاده نمود .
با استفاده از حلقه while بر روی جدول Inserted می توان FOR EACH ROW را پیاده سازی کرد.
Insert
Update
Delete
Inserted
Deleted
8
تابع UPDATE
UPDATE ( column )
از این تابع برای تست اینکه آیا یک ستون از جدول در دستور Insert یا Update آورده شده است یا خیر استفاده می شود .
نکته : این تابع مشخص نمی کند که آیا مقدار ستون واقعا تغییر کرده است یا خیر .
مثال در query زیر
UPDATE customer SET City = City
مقدار با وجود اینکه مقدار City تغییر نکرده تابع Update(City) مقدار True را برمی گرداند . چون ستون City در دستور UPDATE ظاهر شده است .
9
Trigger های بازگشتی
در صورتی که تنظیم مربوط به RECURSIVE_TRIGGERS فعال باشد Trigger ها به صورت بازگشتی فراخوانی می شوند :
مثال
بر روی جدول T1 یک Update انجام می شود
Trigger با نام TR1 فعال می شود این Trigger یک Update بر روی جدول T2 انجام می دهد .
بر روی جدول T2 یک Trigger با نام TR2 وجود دارد که جدول T1 را Update می کند . در این حالت اجرای بازگشتی رخ داده است .
10
فعال سازی و غیر فعال کردن Trigger ها
ENABLE TRIGGER {trigger_name [ ,…n ] | ALL }
ON { table_name | DATABASE | ALL SERVER } [ ; ]
مثال 1 : فعال کردن و غیر فعال کردن یک Trigger خاص
DISABLE Trigger CheckAccountAvg ON Loan;
ENABLE Trigger CheckAccountAvg ON Loan;
11
مثال ها
CREATE TRIGGER reminder
ON titles
FOR INSERT, UPDATE
AS
RAISERROR (50009, 16, 10)
12
CREATE TRIGGER employee_insupd
ON employee
FOR INSERT, UPDATE
AS
DECLARE
@min_lvl tinyint, @max_lvl tinyint, @emp_lvl tinyint, @job_id smallint
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
13
پایان
14