دروس الوحدة (3/4)
مقدمة للمحفزات
المشغل هو مربع سحري (جهاز استشعار) يقوم تلقائيًا بتشغيل جزء من المنطق قبل أو بعد حدث الإدراج أو التحديث أو الحذف في البيانات.\nقبل تعليم جدول كيفية التفاعل، نحتاج إلى إعطائه "وظيفة تشغيل" خاصة مكتوبة بلغة PL/pgSQL والتي يجب أن تنتهي بإرجاع تنسيق تركيبي يسمى "TRIGGER".
لا تقبل هذه الوظائف الوسائط العادية بين قوسين؛ وبدلاً من ذلك يقدمون الكائنات السحرية المدمجة NEW وOLD مجانًا، والتي تحتوي على بيانات الصف الأصلية أو الواردة من الجدول الذي يراقبه المستشعر!
CREATE OR REPLACE FUNCTION audit_deletions()
RETURNS TRIGGER AS $$
BEGIN
-- OLD.id is magically the id value of the poor record being deleted
INSERT INTO audit_log (table_name, record_id, action)
VALUES (TG_TABLE_NAME, OLD.id, 'DELETE');
RETURN OLD; -- Triggers before a Delete route must grant the exit
END;
$$ LANGUAGE plpgsql;يقوم هذا الإجراء بالمهمة الصعبة المتمثلة في الكتابة إلى السجل. لاحقًا، في خطوة ثانية، سيتم ربطه بشكل دائم بأحداث الجدول الذي نريد حمايته.
جربه بنفسك
نحن بحاجة إلى حماية العملاء: لا يجوز لأي شخص يقل عمره عن 18 عامًا (فحصنا الظاهري) أو، بما يتجاوز المنطق الخيالي، نريد فرض تخزين سلسلة "الاسم_الأول" التي تم تمريرها في وقت INSERT دائمًا بأحرف كبيرة في قاعدة البيانات، وتجاهل أي تنسيق لعميل JS.\nاكتب دالة تشغيل تسمى 'force_uppercase_name()'. لا يقبل أية وسائط ().\nويُرجع TRIGGER. قم بإنشاء قالب النص الأساسي.\nفرض تعيين الكائن الوارد بالكامل عبر المهمة السحرية 'NEW.first_name = UPPER(NEW.first_name);'. ثم قم بإرجاع المتغير الجديد المعاد تشكيله.
إظهار التلميح
إنشاء أو استبدال الدالة force_uppercase_name() إرجاع المشغل كـ $$ BEGIN NEW.first_name = UPPER(NEW.first_name); إرجاع جديد؛ نهاية؛ $$ اللغة plpgsql;
الحل متاح بعد 3 من المحاولات
أنشئ وظيفة تشغيل 'protect_price_drops()' التي تحظر التحديثات الضارة عندما يكون المهاجم على وشك توفير سعر منخفض للغاية على منتج ما.\nاستخدم منطقًا مثل 'IF NEW.unit_price < OLD.unit_price THEN'، مما يؤدي إلى رفع الاستثناء الأصلي الذي يؤدي إلى انهيار كل شيء.\nيستخدم استثناء PL/pgSQL الفادح النموذج 'RAISE EXCEPTION ''Prezzo non abbassabile!'';'.
إظهار التلميح
ابدأ إذا كان NEW.unit_price < OLD.unit_price ثم ارفع الاستثناء 'Prezzo not abbassabile!'; نهاية إذا؛ إرجاع جديد؛ نهاية؛
الحل متاح بعد 3 من المحاولات