"Insufficient access rights on cross-reference id" — como corrigir
O que significa o erro "insufficient access rights on cross-reference id" do Salesforce, as cinco causas e como corrigi-lo passo a passo.
INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY: insufficient access rights on cross-reference id é um dos erros mais mal interpretados do Salesforce. O instinto é verificar as permissões no registo que está a guardar — mas o erro quase nunca diz respeito a esse registo. Diz respeito a um registo diferente para o qual ele aponta.
Este guia explica o que a mensagem significa e dá-lhe uma forma repetível de a corrigir.
O que o erro realmente significa
Quando insere ou atualiza um registo, o Salesforce verifica também todos os registos que ele referencia — através de campos de lookup ou master-detail, da propriedade (ownership), ou de operações em related lists. Se o utilizador em execução não conseguir aceder a um desses registos referenciados, toda a operação é rejeitada com insufficient access rights on cross-reference id: <id>.
O <id> é o ID de 15 ou 18 caracteres do registo que o utilizador não consegue alcançar — e não o que está a ser guardado. É essa distinção que é a chave de tudo para o corrigir.
Traduza a mensagem assim: “O utilizador que está a executar esta ação não consegue aceder ao registo relacionado
<id>para o qual este registo aponta.”
Passo 0 — Identificar o registo de cross-reference
Copie o ID do erro e abra-o diretamente:
https://yourdomain.my.salesforce.com/<id>
Agora sabe qual o objeto e o registo que o estão a bloquear (uma Account pai, um Contact num lookup, um proprietário, um Case relacionado, etc.). Todos os passos abaixo visam esse registo.
As cinco causas, por ordem de probabilidade
1. Falta de permissão de objeto
Ao profile ou aos permission sets do utilizador falta o Read (ou Create/Edit) no objeto referenciado. As permissões de objeto são o portão antes de a partilha sequer ser avaliada — veja permissões de objeto vs. partilha de registos. Conceda o CRUD necessário através de um permission set.
2. Segurança ao nível do campo no campo de lookup
O utilizador não consegue ver ou editar o campo que contém a referência. Se a FLS ocultar o campo de lookup, a escrita nele falha. Verifique a segurança ao nível do campo para esse campo no profile/permission sets do utilizador.
3. Sem acesso ao registo referenciado (partilha)
O utilizador tem acesso ao objeto mas não tem acesso ao registo específico relacionado. Causas: um org-wide default Private sem sharing rule, ou o utilizador não está acima do proprietário na hierarquia de funções (role hierarchy). Confirme com o botão Sharing no registo relacionado e, depois, estenda o acesso com uma sharing rule, uma equipa ou uma partilha manual.
4. Automatização a correr no contexto do utilizador
Os Flows configurados para correr “How to run the flow → in user context”, ou o Apex declarado como with sharing, aplicam as permissões do utilizador em execução. Se esse utilizador não conseguir alcançar o registo relacionado, a automatização falha com este erro mesmo que um administrador a tenha testado sem problemas.
- Correção A (recomendada quando apropriado): corra o Flow em contexto de sistema / o Apex como
without sharing, para que a automatização não fique limitada pelo utilizador em execução — use apenas quando o utilizador legitimamente não precisar de acesso direto. - Correção B: conceda efetivamente ao utilizador acesso ao registo relacionado (causas 1–3).
5. Uma referência eliminada, vazia ou malformada
O lookup aponta para um registo que foi eliminado, que nunca existiu, ou cujo ID está vazio/errado (comum em data loads e integrações). O Salesforce reporta registos inexistentes como acesso insuficiente. Valide que o ID corresponde a um registo ativo antes de guardar.
Uma checklist de correção repetível
- Extraia o
<id>do erro e abra-o — identifique o objeto e o registo. - O utilizador tem Read/Edit de objeto nesse objeto? → corrija o profile/permission set.
- O utilizador tem segurança ao nível do campo no campo de lookup? → corrija a FLS.
- O utilizador tem acesso ao registo específico? → verifique o botão Sharing; adicione uma partilha.
- Existe uma automatização a correr no contexto do utilizador? → decida entre contexto de sistema e conceder acesso.
- O ID referenciado ainda corresponde a um registo ativo? → corrija os dados/a integração.
A primeira verificação que falhar é a sua causa-raiz.
Porque este erro é, na verdade, um problema de rastreio de acesso
Todas as causas acima resumem-se à mesma questão subjacente: este utilizador tem realmente acesso a esse registo relacionado e, em caso afirmativo, através de que mecanismo? É algo trabalhoso de responder à mão, abrangendo CRUD, FLS e seis mecanismos de partilha.
O AgentForceAccess responde a isso em linguagem clara — cole o utilizador e o registo, e ele rastreia exatamente que permissão ou partilha concede (ou bloqueia) o acesso, para que deixe de adivinhar qual das cinco causas está a enfrentar.
Perguntas frequentes
A que se refere afinal o "cross-reference id"?
É o ID de registo do Salesforce do registo *relacionado* para o qual a sua ação aponta através de um campo de lookup ou master-detail. O utilizador em execução não tem acesso a esse registo, pelo que o save é rejeitado. Acrescente o ID ao URL da sua org (https://yourdomain.my.salesforce.com/<id>) para o identificar.
Porque é que a mesma ação funciona para um administrador mas falha para um utilizador padrão?
Os administradores costumam ter "View All"/"Modify All" ou "Modify All Data", que ignoram o modelo de partilha. O utilizador padrão é bloqueado pelas permissões de objeto, pela segurança ao nível do campo, ou pela partilha ao nível do registo relacionado. Reproduza a ação como o utilizador afetado para a isolar.
Correr um Flow no contexto de sistema esconde um verdadeiro problema de permissões?
Pode esconder. O contexto de sistema ignora a partilha e o CRUD/FLS do utilizador em execução, o que corrige o erro mas pode conceder um acesso que o utilizador não deveria ter através da interface. Use-o de forma deliberada e confirme que o utilizador deve mesmo conseguir alcançar o registo relacionado.
Este erro pode vir de um registo eliminado ou inexistente?
Sim. Se o lookup apontar para um registo que foi eliminado, que nunca existiu, ou se o ID estiver vazio/malformado, o Salesforce reporta-o como acesso insuficiente em vez de "não encontrado". Confirme que o ID referenciado ainda corresponde a um registo ativo.
Veja na sua própria org
O AgentForceAccess explica, em linguagem clara, porque é que qualquer utilizador vê qualquer registo ou ficheiro — em todos os mecanismos de partilha do Salesforce.
Pedir acesso antecipado