MySQL / التزامن والأداء والتشغيل / الدرس 16
الإجراءات المخزنة والمعالجات والمسؤولية
صمم برامج مخزنة صغيرة بتحقق وأمان وملكية معاملات واضحة.
في هذه الصفحة
أهداف الدرس
- ميّز الإجراءات والدوال والمشغلات والأحداث المجدولة.
- استخدم SIGNAL والمعالجات دون إخفاء الفشل أوتثبيت معاملات المستدعي فجأة.
اختر أصغر كائن مناسب
استخدم mysql_course_lab فقط للتعريفات الاختيارية. يُستدعى الإجراء بـ CALL ويمكنه إعادة نتائج، وتعيد الدالة قيمة داخل تعبير. يعمل المشغل بسبب حدث جدول ويعمل الحدث المجدول عبر المجدول. قد يفاجئ السلوك التلقائي المخفي الصيانة، فاستخدم الكائنات لقواعد محلية واضحة لا كتطبيق ثانٍ غير موثق.
تحقق قبل الحساب
ينبغي أن يحدد الإجراء مجال المدخل و NULL صراحة. فقد يسمح المنطق ثلاثي القيم لكمية مفقودة بتجاوز quantity <= 0. تثير SIGNAL SQLSTATE '45000' استثناءً مخصصاً برسالة واضحة. يحسب المثال عرض سعر فقط ولا يحجز مخزوناً ولا يثبت تخويل المشتري.
USE mysql_course_lab;
DELIMITER //
CREATE PROCEDURE lab_quote_total(IN p_quantity INT,IN p_price DECIMAL(10,2))
SQL SECURITY INVOKER
BEGIN
IF p_quantity IS NULL OR p_quantity<=0 OR p_price IS NULL OR p_price<0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='Invalid quote input';
END IF;
SELECT p_quantity*p_price AS quote_total;
END//
DELIMITER ;
CALL lab_quote_total(2,2.50);
quote_total
5.00
تعيد CALL مقدار 5.00 لأن وحدتين بسعر 2.50 تكلفان خمسة. تعد DELIMITER توجيهاً لعميل mysql لا SQL خادماً، وترسل أدوات أخرى CREATE كاملة بطريقة مختلفة. تستخدم SQL SECURITY INVOKER صلاحيات المستدعي. التعريف DDL تدريبية لمرة واحدة ولا يحميه تراجع التطبيق العادي.
صرّح بالخصائص بصدق
يمكن لدالة تحسب من مدخلاتها فقط أن تكون DETERMINISTIC و NO SQL. تصف التصريحات السلوك ولا تبرهنه آلياً. تخضع الدوال والمشغلات لقيود التحكم بالمعاملات والآثار الجانبية وقد تضيف السجلات الثنائية متطلبات إنشاء. لا تحل خطأ صلاحية بإضعاف إعدادات الثقة العامة؛ راجع حساب النشر وإعداد الخادم.
CREATE FUNCTION lab_taxed(p_amount DECIMAL(10,2))
RETURNS DECIMAL(10,2) DETERMINISTIC NO SQL SQL SECURITY INVOKER
RETURN ROUND(p_amount*1.20,2);
SELECT lab_taxed(10.00) AS gross_amount;
gross_amount
12.00
النتيجة 12.00 بمعدل توضيحي 20 بالمئة. تحتاج الضريبة الفعلية إلى ولاية وزمن وسياسة تقريب خارج هذا الحساب. إن كانت p_amount هي NULL أعاد التعبير NULL؛ ويحتاج اشتراط القيمة إلى تحقق صريح لا استبدال الغياب بصفر.
عالج المعروف دون إخفاء المجهول
تتابع معالجات CONTINUE التنفيذ وتخرج EXIT من كتلتها. قد يخفي معالج SQLEXCEPTION عام يدعي النجاح فشل الثوابت. اجمع التشخيص عند الحاجة وأعد إطلاق الأخطاء بـ RESIGNAL. يجب توضيح ملكية المعاملة؛ فقد يثبت COMMIT داخل إجراء كتابات المستدعي السابقة. فضّل المشاركة في معاملة المستدعي ما لم تنص المواصفات بوضوح على غير ذلك.
انشر الشيفرة المخزنة وراقبها
رقّم تعريفات الإجراءات مع الترحيلات وراجع المنشئ والمنح والاعتماديات وخطة التراجع. تعمل المشغلات داخل معاملة العبارة المحفزة ولا ينبغي أن تفترض شبكات خارجية. تحتاج الأحداث المجدولة إلى مالك ومراقبة؛ فوجودها لا يثبت تنفيذها. تختلف البرامج المخزنة بين MySQL و MariaDB فتحقق من الصياغة والصلاحيات في 8.4.
الأخطاء الشائعة وإصلاحها
ERROR 1644 (45000): Invalid quote input.
- لماذا يحدث؟
- تلقى الإجراء NULL أوكمية غير موجبة أوسعراً سالباً.
- كيف تصلحه؟
- صحح المدخل وأبق فشل التحقق خطأ حقيقياً.
- كيف تتجنب تكراره؟
- اختبر الحدود في التطبيق ومواصفات الإجراء.
ERROR 1304 (42000): routine already exists.
- لماذا يحدث؟
- تكرر نص CREATE دون استراتيجية ترحيل.
- كيف تصلحه؟
- افحص التعريف الحالي قبل ترحيل استبدال مدروس.
- كيف تتجنب تكراره؟
- تتبع الإصدارات وصمم قابلية إعادة النشر عن قصد.
يحول معالج شراء فاشلاً إلى نجاح ظاهري.
- لماذا يحدث؟
- ابتلع معالج CONTINUE عام خطأ قيد أو SQL.
- كيف تصلحه؟
- عالج الحالات المتوقعة فقط وأعد إطلاق ما يبطل العملية.
- كيف تتجنب تكراره؟
- راجع مسارات الفشل وإنهاء المعاملة مع المستدعي.
اختبر فهمك
1. توقع CALL lab_quote_total(NULL,2.50) واشرح فحص NULL.
اعرض الحل المشروح
تثير ERROR 1644 (45000): Invalid quote input. لأن IS NULL صحيح. وبدونه تكون NULL <= 0 مجهولة، وقد يسمح شرط المقارنة وحده بكمية مفقودة ويعيد عرض NULL بلا معنى.
2. من يثبت معاملة تستدعي إجراءات تحقق ومخزون متعددة؟
اعرض الحل المشروح
تملك العملية التجارية في التطبيق الحد عادة لتنجح الإجراءات المشاركة معاً. ينبغي تجنب COMMIT المفاجئة وتمرير الأخطاء المبطلة. ثم يثبت المستدعي بعد نجاح كل الخطوات أويلغي المحاولة كاملة.
أهم ما تعلمته
- اجعل البرامج صغيرة ومحددة الأنواع وواضحة الأمان.
- لا تخف الفشل ولا تفاجئ مالك المعاملة.