"insufficient access rights on object id" 해결 방법
Salesforce "insufficient access rights on object id" 오류의 의미, cross-reference 버전과의 차이, 그리고 단계별 해결 방법을 정리했습니다.
INSUFFICIENT_ACCESS_OR_READONLY: insufficient access rights on object id는 cross-reference 사촌과 거의 똑같아 보이지만, 가리키는 문제는 다릅니다. 이 오류는 직접 건드리는 레코드에 관한 것으로, 사용자가 단순히 그 레코드에 쓸 수 없는 경우입니다.
이 가이드에서는 이 메시지가 무엇을 뜻하는지, cross-reference 버전과 어떻게 구별하는지, 그리고 반복 적용할 수 있는 해결 방법을 설명합니다.
이 오류가 실제로 의미하는 것
사용자가 레코드를 삽입하거나 업데이트하거나 삭제할 때, Salesforce는 쓰기를 허용하기 전에 두 가지를 확인합니다. 사용자의 개체 권한(CRUD)과 레코드 수준 접근 권한(공유)입니다. 저장하려는 레코드에 대해 둘 중 하나라도 없으면, 작업은 다음과 같이 거부됩니다.
INSUFFICIENT_ACCESS_OR_READONLY: insufficient access rights on object id: <id>
<id>는 관련 레코드가 아니라 저장하려고 한 레코드의 15자리 또는 18자리 ID입니다. 실행 사용자는 그 레코드를 보거나 읽을 수는 있지만, 그에 대한 쓰기 권한은 없습니다.
이 메시지는 이렇게 해석하세요: “이 작업을 실행하는 사용자가, 직접 작업 중인 레코드
<id>를 편집(또는 삭제)할 수 없습니다."
"object id” vs “cross-reference id” — 혼동하지 마세요
이 두 오류는 형제 관계로 끊임없이 혼동됩니다.
insufficient access rights on object id | insufficient access rights on cross-reference id | |
|---|---|---|
| 어떤 레코드가 막고 있나? | 저장 중인 레코드 | 그것이 가리키는 관련 레코드(lookup / master-detail) |
| 일반적인 오류 코드 | INSUFFICIENT_ACCESS_OR_READONLY | INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY |
| 가장 먼저 고칠 것 | 이 레코드에 대한 Edit/Delete 권한 | 관련 레코드에 대한 Read 권한 |
메시지의 ID가 저장을 클릭한 그 레코드라면, 당신은 이 글을 제대로 읽고 있는 것입니다. 만약 상위, 소유자, 또는 lookup된 레코드라면 insufficient access rights on cross-reference id를 참고하세요.
0단계 — 레코드 식별하기
오류에서 ID를 복사해 직접 열어 봅니다.
https://yourdomain.my.salesforce.com/<id>
저장하려던 개체와 레코드가 맞는지 확인하세요. 아래의 모든 내용은 그 레코드에 대한 쓰기 권한을 대상으로 합니다.
가능성이 높은 순서대로 살펴보는 네 가지 원인
1. 개체 권한 누락(CRUD)
사용자의 프로필이나 권한 세트에 개체에 대한 Edit(또는 Delete) 권한이 없는 경우입니다. 개체 권한은 공유가 평가되기도 전에 거치는 관문입니다. Edit가 부여되지 않으면 사용자가 전체 레코드 접근 권한을 가지고 있어도 여전히 막힙니다. 개체 권한과 레코드 공유의 차이를 참고하세요. 권한 세트를 통해 필요한 CRUD를 부여하세요.
2. 읽기 전용이거나 레코드 접근 권한 없음(공유)
사용자가 개체 Edit 권한은 있지만 이 특정 레코드에 대해 읽기 권한만 있거나 아예 접근 권한이 없는 경우입니다. 흔한 원인은 다음과 같습니다.
- 사용자에게 도달하는 공유 규칙이 없는 비공개(Private) 조직 전체 기본값.
- 사용자가 역할 계층에서 소유자보다 상위에 있지 않은 경우.
- 레코드가 Read Only로 공유된 경우(공유 규칙, 팀, 또는 수동 공유). 이 경우 열 수는 있지만 저장할 수 없습니다.
레코드의 공유(Sharing) 버튼으로 확인한 다음, 공유 규칙, 팀, 또는 수동 공유로 Read/Write 접근 권한을 확장하세요. 여기서 읽기와 읽기-쓰기의 차이가 바로 “열 수 있다”와 “저장할 수 있다”를 가르는 지점입니다.
3. master-detail 상위에 대한 편집 권한 없음
레코드가 master-detail 관계의 detail 쪽이라면, 그것을 편집하려면 **상위(parent)**에 대한 접근 권한이 필요합니다. 상위를 읽기만 할 수 있는(또는 아예 볼 수 없는) 사용자는 하위를 저장할 수 없으며, Salesforce는 이를 하위의 object id에 대한 접근 권한 부족으로 보고합니다. 사용자에게 상위 레코드에 대한 읽기-쓰기 접근 권한을 부여하세요.
4. 잠겼거나 승인 대기 중인 레코드
활성 승인 프로세스 또는 Apex lock으로 잠긴 레코드는 승인, 회수, 또는 잠금 해제 전까지 누구도(관리자 제외) 편집할 수 없습니다. 이는 실제로 편집 권한이 있는 사용자에게도 동일한 오류를 일으킵니다. 권한을 건드리기 전에 레코드의 승인 이력을 확인하세요.
보너스 원인 — 사용자 컨텍스트로 실행되는 자동화. “in user context”로 실행되도록 설정된 Flow나
with sharing으로 선언된 Apex는 실행 사용자의 접근 권한을 적용합니다. 그 사용자가 레코드에 쓸 수 없으면, 관리자가 테스트했을 때는 잘 되었더라도 자동화는 이 오류로 실패합니다. 자동화를 system context로 실행하거나, 사용자에게 실제 접근 권한을 부여하세요(원인 1~3).
반복 적용 가능한 해결 체크리스트
- 오류에서
<id>를 추출해 열고 — 어떤 레코드가 실패했는지 확인합니다. - 레코드가 승인 프로세스에 있거나 잠겨 있는가? → 그것부터 해결합니다.
- 사용자가 그 개체에 대한 Edit/Delete 권한을 가지고 있는가? → 프로필/권한 세트를 수정합니다.
- 사용자가 (읽기만이 아니라) 읽기-쓰기 레코드 접근 권한을 가지고 있는가? → 공유 버튼을 확인하고 읽기-쓰기 공유를 추가합니다.
- master-detail 하위인가? → 상위에 대한 읽기-쓰기 권한을 부여합니다.
- 자동화가 사용자 컨텍스트로 실행되고 있는가? → system context로 할지 접근 권한을 부여할지 결정합니다.
가장 먼저 실패하는 항목이 근본 원인입니다.
이 오류가 사실은 접근 권한 추적 문제인 이유
위의 모든 원인은 결국 같은 근본 질문으로 귀결됩니다. 이 사용자가 이 레코드에 실제로 쓰기 접근 권한을 가지고 있는가, 그리고 어떤 메커니즘을 통해 그러한가? 이를 CRUD, 소유권, 역할 계층, 그리고 여섯 가지 공유 메커니즘에 걸쳐 손으로 일일이 답하기란 번거로운 일입니다. 특히 읽기와 읽기-쓰기의 차이가 관건일 때는 더욱 그렇습니다.
AgentForceAccess는 이를 평이한 언어로 답해 줍니다. 사용자와 레코드를 붙여 넣기만 하면, 어떤 권한이나 공유가 쓰기 접근을 허용(또는 차단)하는지 정확히 추적해 주므로, 어떤 원인을 보고 있는지 더는 추측할 필요가 없습니다.
자주 묻는 질문
"insufficient access rights on object id"와 "on cross-reference id"의 차이는 무엇인가요?
"On object id"는 직접 삽입, 업데이트, 삭제하는 레코드에 관한 것으로, 사용자가 *그* 레코드에 대한 편집/삭제 권한이 없는 경우입니다. "On cross-reference id"는 lookup이나 master-detail 필드를 통해 도달하는 *관련* 레코드에 관한 것입니다. 같은 계열의 오류지만 대상이 정반대입니다. 메시지의 ID가 저장을 클릭한 그 레코드라면 object-id 버전입니다.
관리자는 레코드를 편집할 수 있는데 일반 사용자는 이 오류가 나는 이유는 무엇인가요?
관리자는 보통 개체에 대해 "Modify All Data" 또는 "Modify All"을 가지고 있으며, 이는 조직 전체 기본값, 공유 규칙, 역할 계층을 우회합니다. 일반 사용자는 개체 권한 또는 레코드 수준 공유에 막힙니다. 원인을 분리하려면 항상 영향받는 사용자로 로그인하거나("Login As" 사용) 그 사용자로 작업을 재현하세요.
사용자가 레코드에 대한 Read 권한이 있는데도 저장 시 접근 권한이 부족한 이유는 무엇인가요?
Read만으로는 쓰기에 충분하지 않습니다. 편집이나 삭제에는 Edit/Delete 개체 권한 *그리고* 읽기-쓰기 레코드 접근 권한이 모두 필요합니다. "Read Only"로 공유된(공유 규칙, 역할 계층, 또는 수동 공유를 통해) 레코드는 사용자가 열 수는 있지만 변경 사항을 저장할 수 없으며, 이는 업데이트 시 접근 권한 부족으로 나타납니다.
잠겼거나 승인 대기 중인 레코드가 이 오류를 일으킬 수도 있나요?
네. 레코드가 활성 승인 프로세스(또는 Apex 잠금)로 잠겨 있는 동안에는 편집 권한이 있는 사용자조차 승인, 회수, 또는 잠금 해제 전까지 저장할 수 없습니다. 권한을 쫓기 전에 레코드가 승인 프로세스에 있는지 먼저 확인하세요.
직접 내 조직에서 확인해 보세요
AgentForceAccess는 모든 Salesforce 공유 메커니즘에 걸쳐, 어떤 사용자가 왜 특정 레코드나 파일을 볼 수 있는지 쉬운 말로 설명합니다.
얼리 액세스 신청