Loading

Anonymes Apex zum Entfernen des Zugriffs auf lizenzierte benutzerdefinierte CPQ-Objekte aus Berechtigungssätzen

Veröffentlichungsdatum: Sep 27, 2025
Beschreibung
Beginnend mit Salesforce CPQ 228 wurden für das Paket Berechtigungssatz-Lizenzen eingeführt. Benutzern muss eine CPQ-Berechtigungssatz-Lizenz zugewiesen sein, um lizenzierte CPQ-Objekte anzeigen und mit ihnen interagieren zu können. Diese Änderung kann sich auf bestehende Berechtigungssätze auswirken, wenn sie Zugriff auf untergeordnete Objekte gewähren, ohne auch Zugriff auf das übergeordnete CPQ-Objekt zu gewähren. Wenn Sie versuchen, Änderungen an diesen Berechtigungssätzen zu speichern, kann eine Validierungsfehlermeldung ähnlich den folgenden Beispielen erscheinen und das Speichern verhindern:
  • Read on XXXXXX can't be granted. Grant the permission using a permission set with the required license or use permission set not associated with a specific license. ("Lesen" für "XXXXXX" kann nicht gewährt werden. Gewähren Sie die Berechtigung unter Verwendung eines Berechtigungssatzes mit der erforderlichen Lizenz oder verwenden Sie einen Berechtigungssatz, der nicht mit einer bestimmten Lizenz verbunden ist.)
  • DEBUG|Obj perms update failed due to the follow reason: System.DmlException: Delete failed. First exception on row 0 with id 110Dx0000074p0iIAA; first error: FIELD_INTEGRITY_EXCEPTION, Cannot take away Read or ViewAllRecords if parent permission set has View All Data permission enabled: [],AnonymousBlock: line 23, column 1 (DEBUG|Obj perms update ist aus folgendem Grund fehlgeschlagen: System.DmlException: Löschen fehlgeschlagen. Erste Ausnahme bei Zeile 0 mit der ID 110Dx0000074p0iIAA; erster Fehler: FIELD_INTEGRITY_EXCEPTION, Die Berechtigung "Lesen" oder "ViewAllRecords" kann nicht entfernt werden, wenn die übergeordnete Berechtigung "Alle Daten anzeigen" aktiviert ist: [],AnonymousBlock: Zeile 23, Spalte 1)
 

Der Berechtigungssatz muss wieder in einen gültigen Zustand versetzt werden, bevor das System Änderungen zulässt. Wenn Sie alle relevanten CPQ-/AA-Objektberechtigungen entfernen, wird der Berechtigungssatz wieder in einen gültigen Zustand versetzt. Um den Berechtigungssatz nach dem Upgrade auf CPQ 228 (Winter '21) zu aktualisieren, können Administratoren die folgende Abfrage verwenden, um CPQ-bezogene Objektberechtigungen aus benutzerdefinierten Profilen zu entfernen. Führen Sie die folgenden Schritte aus, um das Skript in der Developer Console auszuführen:
  1. Developer Console öffnen
  2. Debug > Open Execute Anonymous Window (Fenster für die anonyme Ausführung öffnen) (CTRL+E)
  3. Code kopieren und in das anonyme Fenster einfügen
  4. Prüfen: Protokoll öffnen
  5. Ausführen
  6. Filter "Nur debuggen" aktivieren

HINWEIS: 
  • Das Objekt DocuSign-Empfänger definiert Angebotsvorlage als Master in der Master-Detail-Beziehung. Daher müssen Organisationen, die DocuSign verwenden, die Berechtigungen für das Objekt "DocuSign-Empfänger" möglicherweise entfernen, wenn die Person kein angegebener CPQ-Benutzer mit einer zugehörigen Lizenz ist. Andernfalls muss dem Benutzer eine CPQ-Berechtigungssatz-Lizenz zugewiesen sein.
  • Die Systemberechtigungen Alle Daten anzeigen und Alle Daten modifizieren müssen aus den Berechtigungssätzen entfernt werden, damit das Skript erfolgreich ausgeführt werden kann. 
Lösung
// 1. CPQ+AA-Objekte (LCO + Abhängige) nach Hierarchieordnung zum Löschen definieren String[] customLCOAndDependentObjects = new String[] { 'SBQQ__QuoteLinePricingGuidance__c','SBQQ__QuoteDocument__c','SBQQ__QuoteLineConsumptionRate__c','SBQQ__QuoteLineConsumptionSchedule__c','SBQQ__QuoteLine__c','SBQQ__QuoteLineGroup__c','SBQQ__Quote__c', 'SBQQ__PricingGuidanceTier__c','SBQQ__PricingGuidance__c', 'SBQQ__ErrorCondition__c','SBQQ__ConfigurationRule__c','SBQQ__ProductAction__c','SBQQ__ProductRule__c', 'SBQQ__LookupQuery__c','SBQQ__PriceCondition__c','SBQQ__PriceAction__c','SBQQ__PriceRule__c', 'SBQQ__LineColumn__c','SBQQ__TemplateSection__c','SBQQ__QuoteTemplate__c', 'SBQQ__SubscriptionConsumptionRate__c','SBQQ__SubscriptionConsumptionSchedule__c','SBQQ__SubscribedAsset__c','SBQQ__Subscription__c', 'sbaa__ApprovalSnapshot__c','sbaa__Approval__c', 'sbaa__ApprovalCondition__c','sbaa__ApprovalRule__c' }; // Unten durch Berechtigungssatz-ID ersetzen String permSetId = ''; ObjectPermissions[] profileObjPerms; // 2. Iterieren und löschen, also nicht alles in 1 Batch erledigen for(String objName : customLCOAndDependentObjects) { // Abfrage der Objektberechtigungen nach Objekt profileObjPerms = [SELECT Id FROM ObjectPermissions where Parent.Id = :permSetId and SobjectType = :objName]; System.debug('Object perms for object:'+objName+':'+profileObjPerms.size()); try{ // Vor dem Ausführen die Zeile unten auskommentieren // profileObjPerms; löschen } catch(Exception e){ System.debug('Obj perms update failed due to the follow reason: '+ e + ',' + e.getStackTraceString()); } } // 3. Abfrage, um sicherzustellen, dass alle relevanten Objektgenehmigungen gelöscht sind ObjectPermissions[] objPerms = [SELECT Id FROM ObjectPermissions where Parent.Id = :permSetId and SobjectType = :customLCOAndDependentObjects]; System.debug('Rerun Object Perm Records for CPQ & AA: '+ objPerms.size());


HINWEIS: Wenn "Preisregel" nicht als Master-Objekt für "SBQQ__LookupQuery__c" definiert ist, können Sie 'SBQQ__LookupQuery__c' aus der Liste der Objekte in Schritt 2 des obigen Codes entfernen.
 

SIEHE AUCH

 

Nummer des Knowledge-Artikels

000394589

 
Laden
Salesforce Help | Article