MySQL: مشغلات MySQL ومجدول الأحداث
آخر تحديث: 2026-08-26
المُحفِّز هو إجراء مخزّن يتم تنفيذه تلقائيًا — حيث يتم تشغيله تلقائيًا عند حدوث تغيير في البيانات.
يتناول هذا الدرس المحفزات ومجدول الأحداث.
graph TB
A[Data Change Events] --> B{Trigger Conditions}
B -->|BEFORE| C[Triggered before the operation]
B -->|AFTER| D[Triggered after the operation]
C --> E[BEFORE INSERT<br/>Pre-insertion Validation/Edit]
C --> F[BEFORE UPDATE<br/>Pre-update Validation/Edit]
C --> G[BEFORE DELETE<br/>Verify Before Deleting]
D --> H[AFTER INSERT<br/>Post-insertion synchronization]
D --> I[AFTER UPDATE<br/>Update Log]
D --> J[AFTER DELETE<br/>Clean Up After Deletion]
A --> K[Event Scheduler]
K --> K1[Scheduled Execution]
K --> K2[A one-time event]
1. ما ستتعلمه
- مشغلات «قبل» و«بعد»
- الكلمات المفتاحية «جديد/قديم»
- إدارة المشغلات
- إنشاء حدث: جدولة الأحداث
2. قصة حقيقية
(1) المشكلة: غالبًا ما تؤدي العمليات اليدوية إلى حدوث أخطاء
بعد إطلاق نظام التجارة الإلكترونية، كان فريق العمليات يشكو يوميًا: لم تكن المخزونات تُخصم بعد تقديم الطلبات، ولم تكن سجلات التدقيق تُحدَّث بعد تغييرات الأسعار، وكان تراكم الجلسات المنتهية الصلاحية يؤدي إلى إبطاء عمليات الاستعلام. وظل فريق التطوير يضيف منطقًا إلى كود الأعمال، لكن كان هناك دائمًا من ينسى ذلك — نظرًا لأن كود الخدمات المختلفة كان يُكتب بشكل منفصل، فلم تكن هناك ببساطة أي طريقة لضمان الاتساق على جميع الأصعدة.
(2) الحل باستخدام المشغلات والأحداث
استخدم المشغلات لأتمتة الإجراءات على مستوى قاعدة البيانات: خصم المخزون بعد تقديم الطلب وتسجيل التغييرات بعد إجراء التعديلات؛ واستخدم مجدول الأحداث لتنظيف البيانات منتهية الصلاحية بشكل دوري.
| البعد | منطق مستوى التطبيق | أتمتة قواعد البيانات |
|---|---|---|
| خطر الإغفال | مرتفع (يعتمد على المطور) | صفر (يتم تفعيله تلقائيًا) |
| الاتساق عبر الخدمات | يصعب ضمانه | طبقة قاعدة بيانات موحدة |
| عبء العمليات | يتطلب تنفيذ مهام مجدولة | أداة جدولة الأحداث المدمجة |
| الموثوقية | متوسطة | الأعلى |
3. أساسيات المشغلات
▶ مثال: مشغل AFTER INSERT
DELIMITER //
CREATE TRIGGER trg_after_insert_user
AFTER INSERT ON users
FOR EACH ROW
BEGIN
INSERT INTO user_logs (user_id, action, created_at)
VALUES (NEW.id, 'INSERT', NOW());
END //
DELIMITER ;
▶ مثال: مشغل «BEFORE UPDATE»
DELIMITER //
CREATE TRIGGER trg_before_update_user
BEFORE UPDATE ON users
FOR EACH ROW
BEGIN
SET NEW.updated_at = NOW();
IF NEW.email != OLD.email THEN
SET NEW.email_verified = FALSE;
END IF;
END //
DELIMITER ;
4. الكلمات المفتاحية «الجديدة» و«القديمة»
| الزر | جديد | قديم |
|---|---|---|
| إدراج | الصف الذي تم إدراجه حديثًا | غير متوفر |
| تحديث | القيمة المعدلة | القيمة الأصلية |
| حذف | غير متوفر | الصفوف المحذوفة |
5. إدارة المشغلات
-- View Triggers
SHOW TRIGGERS;
-- Delete Trigger
DROP TRIGGER IF EXISTS trg_after_insert_user;
6. جدولة الأحداث
▶ مثال: المهام المجدولة
-- Start the Event Scheduler
SET GLOBAL event_scheduler = ON;
-- Create an event that runs daily
CREATE EVENT evt_daily_cleanup
ON SCHEDULE EVERY 1 DAY
STARTS '2026-07-04 02:00:00'
DO
DELETE FROM temp_data WHERE created_at < DATE_SUB(NOW(), INTERVAL 30 DAY);
-- Create a One-Time Event
CREATE EVENT evt_one_time
ON SCHEDULE AT '2026-07-10 00:00:00'
DO
UPDATE promotions SET status = 'expired' WHERE end_date < CURDATE();
❓ أسئلة شائعة
SET GLOBAL event_scheduler = ON; لتفعيلها.📖 ملخص
- المحفزات تُنفَّذ تلقائيًا عند حدوث تغيير في البيانات
- قبل: يتم تشغيلها قبل العملية؛ بعد: يتم تشغيلها بعد العملية
- NEW هي القيمة الجديدة، وOLD هي القيمة القديمة
- مجدول المهام يُنفِّذ المهام المجدولة
📝 تمارين
-
سؤال أساسي (مستوى الصعوبة: ⭐): أنشئ مشغلًا لتسجيل التغييرات التي تطرأ على جدول المستخدمين تلقائيًّا.
-
تمرين متقدم (مستوى الصعوبة: ⭐⭐): أنشئ مشغل «BEFORE UPDATE» لتحديث الحقل
updated_atتلقائيًّا. -
التحدي (مستوى الصعوبة: ⭐⭐⭐): قم بإنشاء برنامج جدولة أحداث يقوم بحذف بيانات السجل التي يعود تاريخها إلى 30 يومًا مضت كل يوم عند منتصف الليل.