MariaDB / المتقدم: الأدلة والتشغيل الموثوق / الدرس 17
الروتينات والمحفزات والأحداث
استخدم الشيفرة المخزنة عندما تتضح حدود التنفيذ والصلاحيات، وميز الدوال والإجراءات ومحفزات الصفوف والأحداث المجدولة.
في هذه الصفحة
أهداف الدرس
- شرح تدفق الروتين والإشارات.
- مراجعة ملكية المعاملة وآثار المحفزات غير الظاهرة.
اختر الكائن المخزن المناسب
يستدعى الإجراء بـ CALL وينسق سلسلة عبارات. تعيد الدالة المخزنة قيمة مفردة وتستخدم في التعبيرات مع قيود على عملها. ينفذ المحفز تلقائياً لكل صف متأثر، وينفذ الحدث بجدول زمني عند سماح المجدول والصلاحيات. قد يبسط التنفيذ غير الظاهر ثابتاً محلياً لكنه يفاجئ المستدعين والاستيراد والمزامنة. وثق المالك وسياق الصلاحية والمسؤولية التجارية لكل كائن.
أرسل خطأ تحقق واضحاً
يتحقق الإجراء من رسم ويعيد مبلغاً محسوباً دون تغيير جدول. DELIMITER توجيه لعميل mariadb يسمح بإرسال التعريف والفواصل الداخلية معاً؛ يرسل API عادة CREATE PROCEDURE كسلسلة واحدة دونه. توضح SQL SECURITY INVOKER سياق المستدعي. يعيد الاستدعاء بـ 10 قيمة 11.00 ويرفع الإدخال السالب أو NULL رسالة SQLSTATE 45000. تحتاج الضريبة الحقيقية سياسة تقريب موثقة.
DELIMITER //
CREATE PROCEDURE quote_fee(IN p_fee DECIMAL(9,2))
SQL SECURITY INVOKER
BEGIN
IF p_fee IS NULL OR p_fee < 0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'fee must be nonnegative';
END IF;
SELECT CAST(p_fee * 1.10 AS DECIMAL(10,2)) AS quoted_fee;
END//
DELIMITER ;
CALL quote_fee(10);
quoted_fee
11.00
نتيجة النجاح المتوقعة؛ نص الخطأ المخصص ثابت ولا يترجم.
حدد مالك المعاملة
قد يتحكم الإجراء بالمعاملة في سياقات مسموحة، لكن إجراء ينفذ COMMIT قد ينهي عمل المستدعي دون توقع. لا توفر START TRANSACTION المتكررة معاملات متداخلة عادية. حدد عقداً واضحاً: إما المستدعي مالك المعاملة أو إجراء علوي يملك وحدة العمل كلها. لا تحفظ الدوال والمحفزات أو تتراجع مستقلة، ويجب ألا تخفي معالجات الاستثناء الفشل وتعيد نجاحاً ظاهرياً.
افحص الشيفرة قبل لوم UPDATE بسيطة
قد تشغل كتابة صف واحد محفزات تضيف تدقيقاً أو تتحقق من الحالة. احصر الاعتماديات عند التشخيص والترحيل. تسرد الاستعلامات الروتينات والمحفزات المرئية في التدريب، والرؤية محدودة بالصلاحيات. تكشف SHOW CREATE PROCEDURE أو SHOW CREATE TRIGGER التعريف عند التصريح. تشارك آثار المحفز على الجداول المعاملاتية في معاملة العبارة، وقد يضعف خلط جداول غير معاملاتية ذرية التدقيق.
SELECT ROUTINE_NAME, SECURITY_TYPE
FROM information_schema.ROUTINES
WHERE ROUTINE_SCHEMA = 'harbor_lab' ORDER BY ROUTINE_NAME;
SELECT TRIGGER_NAME, EVENT_MANIPULATION, ACTION_TIMING
FROM information_schema.TRIGGERS
WHERE TRIGGER_SCHEMA = 'harbor_lab' ORDER BY TRIGGER_NAME;
قد يعكس غياب البيانات الوصفية نقص الصلاحية لا غياب الشيفرة.
يحتاج العمل المجدول إدارة دورة حياة
لا يضمن وجود الحدث تنفيذه؛ تؤثر حالة المجدول وصلاحية المعرف والمنح. قد تفعل الاستعادة في الاختبار عملاً مجدولاً دون قصد إذا لم تعزل البيئة. راجع التفعيل والمنطقة الزمنية والتداخل وإعادة المحاولة قبل النشر. احفظ التعريفات في ترحيلات مضبوطة بالإصدارات وقارنها بعد الاستعادة واختبر وضع SQL الفعلي، لأن وضع الإنشاء قد يؤثر في السلوك.
الأخطاء الشائعة وإصلاحها
ERROR 1064 قرب DELIMITER في استدعاء API
- لماذا يحدث؟
- أُرسل توجيه عميل باعتباره SQL للخادم.
- كيف تصلحه؟
- أرسل تعريف الروتين كعبارة API واحدة دون سطور DELIMITER.
- كيف تتجنب تكراره؟
- افصل أعراف سطر الأوامر عن سلوك الموصل.
يحفظ روتين داخلي عملاً آخر للمستدعي
- لماذا يحدث؟
- لم تحدد ملكية المعاملة في عقد الإجراء.
- كيف تصلحه؟
- أعد تحديد الحدود لتملك طبقة واحدة الحفظ والتراجع.
- كيف تتجنب تكراره؟
- وثق سلوك المعاملة في واجهة كل روتين قابل للاستدعاء.
ERROR 1449: The user specified as a definer does not exist
- لماذا يحدث؟
- يشير كائن مستعاد إلى حساب غائب.
- كيف تصلحه؟
- راجع الملكية وسياق الأمان وأعدهما بترحيل مصرح.
- كيف تتجنب تكراره؟
- احصر المعرفين والمنح المطلوبة في بيان النسخة.
اختبر فهمك
1. ماذا ينبغي أن يفعل CALL quote_fee(NULL)، ولماذا لا يكفي p_fee < 0؟
اعرض الحل المشروح
يجب رفع SQLSTATE 45000 برسالة fee must be nonnegative. مقارنة NULL بالصفر مجهولة، فلا يدخل شرط السالب وحده فرع الرفض بالضرورة. يسد IS NULL الفجوة. اختبر الحالتين غير الصالحتين والنتيجة العشرية عند الحدود الصحيحة.
2. تنجح فحوص جداول الاستعادة لكن الحدث الليلي يرسل صادرات مكررة. ما الحد الذي غاب؟
اعرض الحل المشروح
لم تعزل بيئة الاستعادة عن الآثار المجدولة. احصر الأحداث وسياسة المجدول واعتمادات الخروج قبل التشغيل وتحقق من عدم اتصال الاختبار بوجهات الإنتاج. صمم التصدير بمعرف تشغيل وعدم تكرار الأثر. صحة البنية لا تجعل القاعدة آمنة كبيئة تطبيق ثانية نشطة.
أهم ما تعلمته
- تحتاج الشيفرة المخزنة عقود صلاحية ومعاملة ونشر واضحة.
- يجب حصر التنفيذ التلقائي في النسخ والترحيل.