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

تملك جهة الاتصال بالفعل مستخدم Experience Cloud نشطًا، لذا لا يمكن إنشاء مستخدم بوابة جديد لها.

يظهر أثناء: عمليات DML وقت التشغيل، في سكربتات تزويد المستخدمين وترحيلات البيانات

المعنى

يعني PORTAL_USER_ALREADY_EXISTS_FOR_CONTACT أن محاولة إنشاء مستخدم Experience Cloud (مجتمع/بوابة) لجهة اتصال فشلت لأن تلك الجهة تملك واحدًا بالفعل. يسمح Salesforce بمستخدم بوابة نشط واحد فقط لكل جهة اتصال لكل بوابة، لذا تُرفض محاولة الإنشاء الثانية بدلاً من إنشاء هوية مكررة.

القيد محدد النطاق لكل بوابة، وليس لكل مؤسسة: يمكن لجهة الاتصال أن تملك مستخدمي بوابة منفصلين عبر عدة مواقع Experience Cloud مختلفة، ولا يظهر هذا الخطأ إلا عندما تملك البوابة الهدف المحددة بالفعل مستخدمًا نشطًا مرتبطًا بجهة الاتصال تلك.

التشخيص

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

الترحيل يعيد إنشاء المستخدمين دون التحقق من وجود مستخدمين سابقين
يقوم سكربت بتزويد مستخدمي Experience Cloud لمجموعة من جهات الاتصال دون التحقق أولاً مما إذا كان كل منها يملك واحدًا بالفعل.
جهة الاتصال تحمل مرجع بوابة موجود بالفعل في الهدف
جهة اتصال تم ترحيلها بين المؤسسات تملك بالفعل سجل مستخدم بوابة مطابق في مؤسسة الوجهة من عملية مزامنة سابقة.
عمليتا تأهيل تزوّدان نفس جهة الاتصال بشكل منفصل
تحاول سكربتات أو تدفقات عمل متوازية كلاهما إنشاء مستخدم مجتمع لنفس جهة الاتصال في نفس المجتمع.

الحل

  1. استعلم عن مستخدم بوابة موجود قبل إنشاء واحد
    تحقق من جهة الاتصال بحثًا عن سجل User نشط موجود مرتبط بالبوابة الهدف قبل تنفيذ خطوة الإنشاء.
    List<User> existing = [
        SELECT Id FROM User
        WHERE ContactId = :contactId AND IsActive = true AND IsPortalEnabled = true
    ];
  2. أعد تفعيل المستخدمين الموجودين أو حدّثهم بدلاً من إعادة إنشائهم
    استخدم منطقًا شبيهًا بـupsert يحدّث مستخدم البوابة الموجود لجهة الاتصال بدلاً من محاولة إدراج جديد دائمًا.
  3. أزل التكرارات من جهات الاتصال قبل تزويد المستخدمين بشكل جماعي
    نظّف سجلات جهات الاتصال المكررة حتى لا يحاول سكربت التزويد إنشاء مستخدمي بوابة لما يفترض أن يكون شخصًا واحدًا.
من واقع الاستخدام

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

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

تتبع الموافقات والتدقيق في Serpent

الوقاية

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

أسئلة شائعة حول PORTAL_USER_ALREADY_EXISTS_FOR_CONTACT

هل يمكن أن تملك جهة اتصال مستخدمي بوابة في مجتمعين مختلفين؟
نعم، يمكن لجهة الاتصال أن تملك مستخدمي بوابة منفصلين عبر مواقع Experience Cloud مختلفة؛ يمنع هذا الخطأ فقط مستخدمًا ثانيًا لنفس البوابة.
هل يسمح لي إلغاء تفعيل مستخدم البوابة القديم بإنشاء واحد جديد لنفس جهة الاتصال؟
ليس مباشرة. لا يزال Salesforce يربط المستخدم المُلغى تفعيله بجهة الاتصال؛ الحل يكاد يكون دائمًا إعادة تفعيل المستخدم الموجود وتحديثه بدلاً من إنشاء آخر.
هل ينطبق هذا الخطأ على تراخيص Customer Community وPartner Community معًا؟
نعم. ينطبق قيد "مستخدم بوابة نشط واحد لكل جهة اتصال لكل بوابة" عبر جميع أنواع تراخيص Experience Cloud، وليس ترخيصًا واحدًا محددًا فقط.

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

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

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

بدون التزام.