Trigger ها در SQL، برنامههای اجرایی هستند که بهطور خودکار توسط پایگاه داده در واکنش به یک رویداد خاص (مثل درج، بهروزرسانی یا حذف دادهها) فعال میشوند. به عبارت دیگر، Trigger ها به محض وقوع تغییرات خاص در جداول پایگاه داده بهطور خودکار اجرا میشوند و به شما این امکان را میدهند که کارهایی را پیش یا پس از تغییر دادهها انجام دهید.
انواع Trigger در SQL:
- BEFORE Trigger: این نوع Trigger قبل از اعمال تغییرات به جدول (قبل از عملیات INSERT، UPDATE یا DELETE) اجرا میشود.
- AFTER Trigger: این نوع Trigger پس از اعمال تغییرات به جدول (پس از عملیات INSERT، UPDATE یا DELETE) اجرا میشود.
- INSTEAD OF Trigger: این نوع Trigger به جای انجام عملیات اصلی (مثلاً INSERT، UPDATE یا DELETE)، دستورالعملهای خود را اجرا میکند.
مزایای استفاده از Trigger:
- حفظ تمامیت دادهها: با استفاده از Trigger ها میتوانید قوانین خاصی را برای حفظ انسجام دادهها تعریف کنید. به عنوان مثال، میتوانید با استفاده از Trigger ها، دادههای نادرست را شناسایی کرده و آنها را اصلاح یا جلوگیری کنید.
- اتوماسیون فرآیندها: میتوانید اقدامات مختلفی مثل ارسال ایمیل، نوشتن لاگها، یا حتی ایجاد کپی از دادهها را بهطور خودکار پس از انجام یک عملیات خاص انجام دهید.
- کنترل دسترسی به دادهها: میتوانید با استفاده از Trigger ها، برخی از دسترسیها را بر اساس عملیاتهایی که روی دادهها انجام میشود، محدود کنید.
ساختار کلی دستور CREATE TRIGGER:
برای ایجاد یک Trigger در SQL، از دستور CREATE TRIGGER استفاده میشود. ساختار کلی آن به شرح زیر است:
{BEFORE | AFTER | INSTEAD OF} {INSERT | UPDATE | DELETE}
ON table_name
FOR EACH ROW
BEGIN
-- دستورات SQL که باید اجرا شوند
END;
- trigger_name: نام Trigger.
- {BEFORE | AFTER | INSTEAD OF}: زمان اجرای Trigger را مشخص میکند. بهطور مثال، آیا قبل از تغییرات (BEFORE) یا بعد از تغییرات (AFTER) اجرا شود.
- {INSERT | UPDATE | DELETE}: نوع عملیاتی که Trigger به آن پاسخ میدهد.
- table_name: نام جدول که Trigger مربوط به آن است.
- FOR EACH ROW: برای هر ردیف از دادهای که تغییر کرده است، این دستور اجرا میشود.
مثالهای استفاده از Trigger:
1. ایجاد Trigger برای ثبت تغییرات (AFTER INSERT)
فرض کنید میخواهید یک Trigger ایجاد کنید که بعد از اضافه شدن یک رکورد جدید به جدول employees، تاریخ و زمان درج آن را در یک جدول دیگر به نام audit_log ثبت کند.
AFTER INSERT ON employees
FOR EACH ROW
BEGIN
INSERT INTO audit_log (action, table_name, record_id, timestamp)
VALUES ('INSERT', 'employees', NEW.employee_id, NOW());
END;
در این مثال:
- بعد از هر INSERT در جدول employees، یک رکورد جدید در جدول audit_log ثبت میشود که شامل نوع عملیات (INSERT)، نام جدول (employees)، شناسه رکورد جدید و تاریخ و زمان ایجاد آن است.
- NEW.employee_id به مقدار employee_id از رکورد جدید اشاره میکند که بهطور خودکار توسط SQL مدیریت میشود.
2. ایجاد Trigger برای جلوگیری از حذف دادهها (BEFORE DELETE)
در این مثال، فرض کنید میخواهید از حذف یک کارمند جلوگیری کنید اگر او هنوز در حال انجام پروژهها باشد. بهطور فرضی، جدول projects نشاندهنده پروژههایی است که کارمندان در آنها مشغول هستند.
BEFORE DELETE ON employees
FOR EACH ROW
BEGIN
DECLARE project_count INT;
SELECT COUNT(*) INTO project_count
FROM projects
WHERE employee_id = OLD.employee_id;
IF project_count > 0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Cannot delete employee with ongoing projects';
END IF;
END;
در این مثال:
- قبل از حذف هر رکورد از جدول employees، تعداد پروژههایی که آن کارمند در آنها مشغول است بررسی میشود.
- اگر کارمند هنوز پروژههایی داشته باشد (project_count > 0)، حذف کارمند متوقف میشود و یک پیام خطا به کاربر ارسال میشود.
3. ایجاد Trigger برای بهروزرسانی خودکار (AFTER UPDATE)
فرض کنید میخواهید پس از هر بهروزرسانی در جدول employees، اطلاعات تغییر یافته را در یک جدول تاریخچه به نام employee_history ذخیره کنید.
AFTER UPDATE ON employees
FOR EACH ROW
BEGIN
INSERT INTO employee_history (employee_id, old_salary, new_salary, change_date)
VALUES (OLD.employee_id, OLD.salary, NEW.salary, NOW());
END;
در این مثال:
- پس از هر UPDATE روی جدول employees، یک رکورد جدید در جدول employee_history ذخیره میشود که شامل شناسه کارمند، دستمزد قدیم، دستمزد جدید و تاریخ تغییر است.
- OLD.salary مقدار دستمزد قبل از بهروزرسانی و NEW.salary مقدار دستمزد پس از بهروزرسانی است.
ویژگیهای مهم Trigger ها:
- عملکرد خودکار: Trigger ها بهطور خودکار اجرا میشوند و نیازی به فراخوانی دستی آنها نیست.
- محدود به جدول خاص: هر Trigger تنها برای یک جدول خاص قابل تعریف است.
- اعمال تغییرات برای هر ردیف: اغلب Trigger ها برای هر ردیفی که تغییر میکند اجرا میشوند، مگر اینکه محدودیتهای خاصی برای آنها تعریف شود.
- حفاظت از یکپارچگی دادهها: Trigger ها میتوانند به حفظ یکپارچگی دادهها کمک کنند، مثلاً با جلوگیری از حذف دادههای حساس یا نادرست.
محدودیتها و نکات مهم:
- تأثیر روی عملکرد: استفاده نادرست از Trigger ها میتواند باعث کاهش عملکرد پایگاه داده شود، زیرا هر تغییر در دادهها باید با اجرای Trigger های مربوطه همراه باشد.
- دستورات پیچیده و حلقهها: استفاده از دستورات پیچیده و حلقهها در Trigger ها میتواند باعث بروز مشکلات عملکردی و پیچیدگیهای غیرضروری شود.
- برخی پایگاههای داده ممکن است از تعداد محدودی Trigger پشتیبانی کنند، بنابراین باید در استفاده از آنها دقت کنید.
نتیجهگیری:
Trigger ها ابزارهای قدرتمندی در SQL هستند که برای اتوماسیون فرآیندها، حفظ یکپارچگی دادهها و جلوگیری از تغییرات غیرمجاز استفاده میشوند. با این حال، باید در استفاده از آنها دقت کنید تا از کاهش عملکرد و پیچیدگیهای اضافی جلوگیری شود.
