MySQL: مشغلات MySQL ومجدول الأحداث

آخر تحديث: 2026-08-26

المُحفِّز هو إجراء مخزّن يتم تنفيذه تلقائيًا — حيث يتم تشغيله تلقائيًا عند حدوث تغيير في البيانات.

يتناول هذا الدرس المحفزات ومجدول الأحداث.

100%
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

SQL
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»

SQL
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. إدارة المشغلات

SQL
-- View Triggers
SHOW TRIGGERS;

-- Delete Trigger
DROP TRIGGER IF EXISTS trg_after_insert_user;


6. جدولة الأحداث

▶ مثال: المهام المجدولة

SQL
-- 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();
▶ جرّب الكود

❓ أسئلة شائعة

س هل يمكن للمشغلات تعديل الجداول الأخرى؟
ج نعم. يمكن للمشغلات تنفيذ عمليات INSERT وUPDATE وDELETE على الجداول الأخرى.
س هل تؤثر المشغلات على الأداء؟
ج يتم تشغيلها لكل صف، ويكون تأثيرها ملحوظًا أثناء العمليات الدفعية. لذا يجب توخي الحذر عند استخدامها.
س هل أداة جدولة الأحداث مُفعَّلة بشكل افتراضي؟
ج إنها معطلة بشكل افتراضي. تحتاج إلى SET GLOBAL event_scheduler = ON; لتفعيلها.
س هل يمكن للمشغلات استدعاء برامج خارجية؟
ج لا. لا يمكن للمشغلات سوى تنفيذ عبارات SQL؛ ولا يمكنها استدعاء أوامر نظام التشغيل أو واجهات برمجة التطبيقات الخارجية.
س ما هو الحد الأقصى لعدد المشغلات لكل جدول؟
ج لا يمكن تشغيل سوى مشغل واحد لنفس الحدث في نفس الوقت. وهذا يعني أن الحد الأقصى هو 6 مشغلات لكل جدول (BEFORE/AFTER × INSERT/UPDATE/DELETE).

📖 ملخص


📝 تمارين

  1. سؤال أساسي (مستوى الصعوبة: ⭐): أنشئ مشغلًا لتسجيل التغييرات التي تطرأ على جدول المستخدمين تلقائيًّا.

  2. تمرين متقدم (مستوى الصعوبة: ⭐⭐): أنشئ مشغل «BEFORE UPDATE» لتحديث الحقل updated_at تلقائيًّا.

  3. التحدي (مستوى الصعوبة: ⭐⭐⭐): قم بإنشاء برنامج جدولة أحداث يقوم بحذف بيانات السجل التي يعود تاريخها إلى 30 يومًا مضت كل يوم عند منتصف الليل.

Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%