شرح صفوف ومحتوى الفقرة
للوصول إلى بيانات الصف الذي يجري تعديله داخل جسم المشغل، يوفر محرك MySQL 8.4 سجلّين افتراضيين هما OLD وNEW. تعتمد إتاحة هذين السجلين على نوع العملية: في مشغلات INSERT يتوفر السجل NEW فقط لأن الصف لم يكن موجوداً من قبل؛ وفي مشغلات DELETE يتوفر السجل OLD فقط لقراءة بيانات الصف المحذوف؛ أما في مشغلات UPDATE فيتوفر السجلان معاً حيث يمثل OLD.col القيمة السابقة قبل التحديث ويمثل NEW.col القيمة الجديدة.
انتبه لقاعدة القراءة والكتابة الصارمة: السجل OLD يكون للقراءة فقط دائماً في جميع المشغلات، بينما يمكن تعديل قيم NEW.col عبر الأمر SET داخل مشغلات BEFORE INSERT وBEFORE UPDATE حصرياً، ويصبح للقراءة فقط في مشغلات AFTER لأن الصف يكون قد كُتب بالفعل في الجدول.
SQL
DELIMITER $$
CREATE TRIGGER trg_orders_after_update
AFTER UPDATE ON orders
FOR EACH ROW
BEGIN
IF OLD.amount <> NEW.amount THEN
INSERT INTO order_price_logs (order_id, old_amt, new_amt, changed_on)
VALUES (OLD.order_id, OLD.amount, NEW.amount, CURRENT_TIMESTAMP);
END IF;
END$$
DELIMITER ;