تقييم الدرس 21: المحفزات: دوال تعمل تلقائيًّا. إجاباتك تُحفظ تلقائيًّا على هذا الجهاز؛ أجب ثم اضغط «صحّح ورقتي».
1السؤال الأول: اختر الإجابة الصحيحة
1) نوع إرجاع دالة المحفز في PostgreSQL:
2) ماذا يحدث عند تنفيذ الإدخال؟
query.sql
CREATEFUNCTION f() RETURNStriggerLANGUAGEplpgsqlAS $$ BEGINRETURNNULL; END $$;CREATETRIGGER t BEFOREINSERTON categories FOREACHROWEXECUTEFUNCTION f();INSERTINTO categories (name) VALUES ('رياضة');
3) أي محفز أنسب لسجل تدقيق التعديلات؟
4) في MySQL يُكتب للحدثين INSERT و DELETE:
5) WHEN (OLD.price IS DISTINCT FROM NEW.price) تعني:
2السؤال الثاني: صح أم خطأ
1) المحفز يُستدعى بـ CALL.
الصواب: خطأ
2) محفز BEFORE يستطيع تعديل الصف قبل حفظه.
الصواب: صح
3) OLD متاح في محفز INSERT.
الصواب: خطأ
4) RAISE EXCEPTION في المحفز يلغي العملية التي شغّلته.
الصواب: صح
5) FOR EACH ROW يعني أن المحفز يعمل مرة لكل صف متأثر.
الصواب: صح
3السؤال الثالث: أكمل الفراغات من القائمة المنسدلة
1) الصف بعد التغيير في المحفز يُسمّى .
الإجابة: NEW
2) لربط المحفز بالدالة: … FOR EACH ROWf();
الإجابة: EXECUTE FUNCTION
3) نوع العملية التي شغّلت المحفز في المتغير .
الإجابة: TG_OP
4السؤال الرابع: أسئلة عملية
1) كم صفًّا في سجل الأسعار بعد التنفيذ؟
query.sql
CREATETABLE price_log ( product_id int, old_price numeric, new_price numeric, changed_at timestamptzDEFAULTnow());CREATEFUNCTION log_price() RETURNStriggerLANGUAGEplpgsqlAS $$BEGININSERTINTO price_log (product_id, old_price, new_price)VALUES (OLD.id, OLD.price, NEW.price);RETURNNEW;END;$$;CREATETRIGGER trg_price_logAFTERUPDATEOF price ON productsFOREACHROWWHEN (OLD.price ISDISTINCTFROMNEW.price)EXECUTEFUNCTION log_price();UPDATE products SET price = price + 1WHERE category_id IN (1, 3);UPDATE products SET price = price WHERE id = 9;SELECTcount(*) FROM price_log;
الناتج الصحيح:
النتيجة · صف واحد
count
5
2) ما ناتج هذا الكود؟
query.sql
CREATEFUNCTION up() RETURNStriggerLANGUAGEplpgsqlAS $$ BEGINNEW.name := upper(NEW.name); RETURNNEW; END $$;CREATETRIGGER t BEFOREINSERTON categories FOREACHROWEXECUTEFUNCTION up();INSERTINTO categories (name) VALUES ('sport');SELECT name FROM categories WHERE id = 6;