كيفية إصلاح INVALID_FIELD_FOR_INSERT_UPDATE في عمليات نشر Salesforce

تحاول عملية النشر الكتابة إلى حقل غير قابل للكتابة، مثل حقل صيغة أو حقل لا يملك المستخدم المنفّذ صلاحية تعديله.

يظهر أثناء: عملية DML وقت الترجمة أو وقت التشغيل، غالبًا داخل اختبار Apex

المعنى

يعني الخطأ INVALID_FIELD_FOR_INSERT_UPDATE أن عملية DML، غالبًا داخل اختبار Apex، حاولت تعيين قيمة لحقل لا يمكن الكتابة فيه مباشرة. يحدث هذا مع حقول الصيغ وحقول التجميع التراكمي والحقول النظامية، وأيضًا عندما يجعل أمان مستوى الحقل (Field-Level Security) الحقل للقراءة فقط بالنسبة للملف الشخصي الذي ينفّذ العملية.

بالنسبة للحقول غير القابلة للكتابة فعليًا مثل الصيغ، يكتشف Apex هذا وقت الترجمة إذا استُخدمت صياغة SObject الحرفية؛ أما قيود أمان مستوى الحقل فلا تظهر إلا وقت التشغيل، لأن نفس الكود قد ينجح مع ملف شخصي ويفشل مع آخر.

التشخيص

الأسباب الشائعة

الكتابة إلى حقل صيغة أو حقل تجميع تراكمي
يقوم كود مصنع بيانات الاختبار بتعيين قيمة مباشرة لحقل محسوب فعليًا، فيرفض النظام الأساسي عملية الكتابة.
أمان مستوى الحقل يجعل الحقل للقراءة فقط
لا يملك الملف الشخصي أو مجموعة الأذونات التي تُنفّذ عملية النشر صلاحية التعديل على الحقل الذي تتم الكتابة إليه.
تم تغيير نوع الحقل إلى حقل محسوب
تم تحويل حقل كان قابلاً للتعديل سابقًا إلى حقل صيغة، لكن الكود الذي يكتب إليه مباشرة لم يُحدَّث أبدًا.

الحل

  1. أزل الكتابة المباشرة
    احذف سطر كود إعداد الاختبار الذي يعيّن قيمة للحقل الصيغة أو التجميع التراكمي أو الحقل النظامي.
  2. امنح صلاحية التعديل إذا كان يجب أن يكون الحقل قابلاً للكتابة
    حدّث أمان مستوى الحقل على الملف الشخصي أو مجموعة الأذونات المستخدمة للنشر إذا كان الحقل يُفترض فعلاً أن يكون قابلاً للتعديل.
  3. دقّق تغييرات نوع الحقل
    بعد تحويل أي حقل إلى صيغة، ابحث في قاعدة الكود عن عمليات كتابة DML مباشرة إليه وأزلها.
    grep -rn "Amount_Rollup__c\s*=" force-app/main/default/classes/
من واقع الاستخدام

إزاي Serpent بتمنع ده

يرصد Serpent AI تعارضات أمان مستوى الحقل بين البيئات أثناء مراجعة ما قبل التنفيذ، قبل أن تظهر كفشل وقت التشغيل. راجع مكتبة أخطاء نشر Salesforce.

الـ metadata والبيانات في مسار نشر واحد داخل Serpent

الوقاية

ابحث في قاعدة الكود قبل تحويل أي حقل إلى صيغة
افحص Apex وFlow بحثًا عن الكتابة المباشرة إلى الحقل قبل تغيير نوعه، ونظّفها كجزء من نفس عملية النشر.
حافظ على تزامن مصانع بيانات الاختبار مع تغييرات أمان مستوى الحقل
كلما تغيّر أمان مستوى الحقل (FLS) لحقل ما بالنسبة لملف النشر أو ملف تشغيل الاختبار، راجع كود إعداد الاختبار الذي يكتب إلى ذلك الحقل.
فضّل مصانع الاختبار المعتمدة على المخطط على قوائم الحقول الثابتة
ابنِ بيانات الاختبار عبر مصنع يقرأ الحقول القابلة للكتابة من نتائج describe، حتى يفشل تغيير نوع الحقل بشكل واضح ومبكر بدلاً من الفشل الصامت في الإنتاج.
أسئلة شائعة

INVALID_FIELD_FOR_INSERT_UPDATE، بالتفصيل

لماذا بدأ هذا يحدث فقط بعد عملية نشر حديثة؟
تحقق مما إذا كان أحد الحقول قد تم تحويله مؤخرًا إلى صيغة أو تجميع تراكمي. الكود الذي كان يكتب إليه مباشرة سيفشل من تلك اللحظة فصاعدًا.
هل ينطبق هذا الخطأ على الحقول النظامية مثل CreatedDate؟
نعم. لا يمكن الكتابة مباشرة عبر DML العادية إلى الحقول التي يديرها النظام مثل CreatedDate وLastModifiedDate وId؛ يمكن ضبط عدد قليل منها فقط عبر خيارات API خاصة مثل حقول التدقيق القابلة للإنشاء، وهي ميزة لا تفعّلها معظم المؤسسات.
هل تؤثر 'without sharing' أو 'with sharing' على هذا الخطأ؟
لا. تتحكم كلمات المشاركة في رؤية السجلات وليس في قابلية الكتابة على مستوى الحقل؛ حقل الصيغة غير قابل للكتابة بغض النظر عن وضع المشاركة لفئة Apex.

ابدأ مجانًا. بدون بطاقة ائتمان، وبدون تثبيت، وبدون التزام.

الإعداد في أقل من 15 دقيقة. بدون الحاجة لتوظيف مختص DevOps.

هل تريد معرفة كيف يمكنكم الشحن أسرع قبل البدء؟ لنتحدث

بدون التزام.