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

تطابق عملية upsert أكثر من سجل موجود بنفس قيمة المعرف الخارجي، فلا تستطيع Salesforce تحديد أيها يجب تحديثه.

يظهر أثناء: عمليات upsert DML في تحميل البيانات والتكاملات وApex

المعنى

يعني DUPLICATE_EXTERNAL_ID أن استدعاء upsert وجد أكثر من سجل واحد في المؤسسة الهدف يشترك في نفس القيمة في حقل المعرف الخارجي الذي يتم المطابقة عليه. تعتمد عملية upsert على أن يكون ذلك الحقل فريدًا حقًا لكل سجل؛ فعندما توجد تكرارات، لا تجد Salesforce طريقة لتحديد السجل الذي يجب أن تُحدّثه البيانات الواردة، لذا ترفض العملية بدلًا من التخمين.

هذه مشكلة تتعلق فقط بحالة البيانات في المؤسسة الهدف، وليست خللًا في الحمولة الواردة نفسها؛ نفس استدعاء upsert سينجح بمجرد حل القيم المكررة في المؤسسة الهدف.

التشخيص

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

حقل المعرف الخارجي لم يُعلَّم أبدًا كفريد
تُرك خاصية "Unique" للحقل غير مفعّلة عند إنشائه، ما لم يمنع إدخال قيم مكررة بمرور الوقت.
تم تشغيل الترحيل قبل إزالة التكرار من بيانات المصدر
أدخل تحميل بيانات قيم معرفات خارجية مكررة قبل أن يتحقق أحد من أن المؤسسة الهدف تحتوي بالفعل على سجلات بنفس تلك القيم.
أنظمة مدمجة أسندت نفس المفتاح مرتين
ولّد نظاما مصدر مستقلان نفس قيمة المعرف الخارجي لسجلات مختلفة، وانتهى بهما الأمر في نفس المؤسسة.

الحل

  1. أزل التكرار أولًا من السجلات المشتركة في نفس المعرف الخارجي
    استعلم في المؤسسة الهدف عن القيمة المخالفة، وحدد أي سجل هو المرجعي، وادمج أو احذف الباقي قبل إعادة المحاولة.
    SELECT External_Id__c, COUNT(Id)
    FROM Account
    GROUP BY External_Id__c
    HAVING COUNT(Id) > 1
  2. فعّل خاصية Unique على الحقل
    عدّل تعريف حقل المعرف الخارجي بحيث تفرض Salesforce التفرد من الآن فصاعدًا وتمنع التكرارات الجديدة وقت الإدخال.
  3. استخدم مفتاحًا مركبًا أكثر تحديدًا
    إذا كان سجلان مختلفان فعليًا يمكن أن يشتركا في القيمة الأساسية، فادمجها مع حقل ثانٍ بحيث تكون المطابقة قاطعة.
من واقع الاستخدام

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

يحافظ Serpent على مزامنة كل sandbox وscratch org من نفس المصدر، ما يقلل بشكل كبير من احتمال تراكم قيم معرفات خارجية مكررة ناتجة عن بيانات قديمة مُحمّلة يدويًا بين البيئات. اطّلع على مكتبة أخطاء نشر Salesforce.

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

الوقاية

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

DUPLICATE_EXTERNAL_ID: الإجابة

هل يعني DUPLICATE_EXTERNAL_ID أن بياناتي تالفة؟
ليس بالضرورة. عادةً ما يعني فقط أن نفس قيمة المعرف الخارجي وصلت إلى المؤسسة مرتين من عمليتي تحميل أو نظامين منفصلين، وليس أن هناك خللًا آخر في السجلات.
هل يؤدي تعليم الحقل بـ Unique لاحقًا إلى حل التكرارات الموجودة بأثر رجعي؟
لا. لن تسمح لك Salesforce بتفعيل خاصية Unique بينما توجد قيم مكررة بالفعل؛ يجب حل التكرارات أولًا، ثم تطبيق القيد.
هل يحدث هذا مع upsert القياسية وكذلك مهام upsert في Bulk API؟
نعم. يفرض كل من استدعاء upsert() القياسي في DML ومهام upsert في Bulk API نفس متطلب التفرد على حقل المعرف الخارجي الذي تتم المطابقة عليه.

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

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

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

بدون التزام.