Loading

Apex anonimo per rimuovere l'accesso all'oggetto personalizzato CPQ dagli insiemi di autorizzazioni

Data pubblicazione: Sep 27, 2025
Descrizione
A partire da Salesforce CPQ 228, le licenze insieme di autorizzazioni sono state introdotte per il pacchetto. Gli utenti devono avere una licenza insieme di autorizzazioni CPQ assegnata per poter visualizzare e interagire con gli oggetti con licenza CPQ. Questa modifica può avere un impatto sugli insiemi di autorizzazioni esistenti, se questi concedono l'accesso agli oggetti controllati senza concederlo anche all'oggetto CPQ controllante. Quando si tenta di salvare le modifiche a questi insiemi di autorizzazioni, può comparire un messaggio di errore di convalida simile agli esempi seguenti, che impedisce l'azione di salvataggio:
  • Impossibile concedere Lettura su XXXXXX. Concedere l'autorizzazione utilizzando un insieme di autorizzazioni con la licenza richiesta oppure utilizzare un insieme di autorizzazioni non associato a una licenza specifica.
  • DEBUG|Aggiornamento autorizzazioni oggetti non riuscito per il seguente motivo: System.DmlException: Eliminazione non riuscita. 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
 

L'insieme di autorizzazioni deve essere riportato a uno stato valido prima che il sistema consenta qualsiasi tipo di modifica. Rimuovendo tutte le autorizzazioni per gli oggetti CPQ/AA, l'insieme di autorizzazioni tornerà a essere valido. Per aggiornare l'insieme di autorizzazioni in modo che sia conforme dopo l'aggiornamento a CPQ 228 (Winter '21), gli amministratori possono utilizzare la query seguente per facilitare la rimozione delle autorizzazioni per gli oggetti correlati a CPQ dai profili personalizzati. Seguire la procedura descritta di seguito per eseguire lo script nella Developer Console:
  1. Aprire la Developer Console
  2. Debug > Open Execute Anonymous Window (Apri finestra di esecuzione anonima) (CTRL+E)
  3. Copiare e incollare il codice nella finestra anonima
  4. Controllare: Open Log (Apri registro)
  5. Execute (Esegui)
  6. Selezionare la casella del filtro "Debug Only" (Solo debug)

NOTA: 
  • L'oggetto Destinatario DocuSign definisce il modello di preventivo come relazione record principale-record dettaglio. Quindi, è possibile che per le organizzazioni che utilizzano DocuSign sia necessario rimuovere le autorizzazioni per l'oggetto Destinatario DocuSign se la persona non è un utente CPQ designato con una licenza correlata. In caso contrario, sarà necessario assegnare all'utente una licenza insieme di autorizzazioni CPQ.
  • Le autorizzazioni di sistema Visualizza tutti i dati e Modifica tutti i dati devono essere rimosse da Insiemi di autorizzazioni per poter eseguire correttamente lo script. 
Risoluzione
// 1. Define CPQ+AA objects (LCO + dependents) by hierarchy order for deletion 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' }; // replace below with perm set id String permSetId = ''; ObjectPermissions[] profileObjPerms; // 2. Iterate and delete, so not all done in 1 batch for(String objName : customLCOAndDependentObjects) { // Query for object permissions by object profileObjPerms = [SELECT Id FROM ObjectPermissions where Parent.Id = :permSetId and SobjectType = :objName]; System.debug('Object perms for object:'+objName+':'+profileObjPerms.size()); try{ // Uncomment below line before executing // delete profileObjPerms; } catch(Exception e){ System.debug('Obj perms update failed due to the follow reason: '+ e + ',' + e.getStackTraceString()); } } // 3. Query to ensure all the relevant object perms are cleared ObjectPermissions[] objPerms = [SELECT Id FROM ObjectPermissions where Parent.Id = :permSetId and SobjectType = :customLCOAndDependentObjects]; System.debug('Rerun Object Perm Records for CPQ & AA: '+ objPerms.size());


NOTA: se l'oggetto Regola prezzi non è definito come oggetto principale per SBQQ__LookupQuery__c, è possibile rimuovere 'SBQQ__LookupQuery__c' dall'elenco degli oggetti nel passaggio 2 del codice riportato sopra.
 

VEDERE ANCHE

 

Numero articolo Knowledge

000394589

 
Caricamento
Salesforce Help | Article