ユーザ編集権限とinsufficient access rights on cross-reference idエラーについてです。Apexで処理の自動化の仕組みを構築する場合は下記のエラーが発生することがあると思います。
INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY, insufficient access rights on cross-reference id: []
このエラー自体はアクセス権限が不足していることによるエラーです。
非公開オブジェクトや更新権限を付与していないオブジェクトへのデータ更新で発生します。取引先などの標準オブジェクトやカスタムオブジェクトの場合は共有設定の権限見直しですぐに解決できますが、ユーザオブジェクトなど一部のオブジェクトの場合は共有設定では公開/参照のみの権限までしか付与できないため考慮が必要になります。
ユーザオブジェクトに更新権限を付与する必要が発生する場面のイメージとしては、データ更新時に所有者などのユーザのカスタム項目をApexトリガなどでUpdate処理を行うような場合に発生します。ログインユーザ自身のデータ更新なら問題ありませんが、他ユーザのデータ更新を行うには更新権限が必要です。
この問題の対応方法としては共有ルールで更新権限を付与する方法があります。
更新権限を付与することでApex経由でのユーザのカスタム項目更新を実行できるようになります。Apexから処理を実行する場合は項目レベルセキュリティの編集権限の付与は無しの状態でも実行できます。
ただしこの方法を選択する際の注意点があります。
- 標準項目の項目レベルセキュリティ設定は変更不可
- ユーザのプロファイルページから編集操作への考慮が必要
まずユーザオブジェクトは少し特殊で標準項目に対しての項目レベルセキュリティを変更することができません。そのため編集ページにアクセスできれば管理者以外でも任意の内容に変更できるという認識が必要です。
続いてプロファイルページからの編集操作への考慮についてです。ユーザのプロファイルページにはChatterやレコードの所有者リンクからアクセスできます。共有ルール等で更新権限を付与することで、他のユーザの情報に対してもデータの更新が可能な状態となります。
これの対応方法としてはユーザのプロファイルページレイアウトで参照のみ項目にすることで編集ページにアクセスしても参照のみ権限に変更できます。
氏名とメールアドレスは必須項目となるため参照のみ権限への変更はできないのですが、レイアウトから非表示にすることが可能です。数式項目を用意することで編集可能な標準項目は非表示にしつつ参照のみ項目を表示することも可能です。
この対応で編集ページへのアクセスが行われても任意の値に変更できないようになります。(自己紹介項目などログインしたユーザ側で任意の情報に変更する項目がある場合は専用の入力フォームを用意するか利用を中止するかなどの対応が必要になります。)
上記対応でモバイル側からも変更できないように制御されます。
ユーザの編集ページはもう1箇所あります。ユーザの詳細ページです。こちらに関してはプロファイルで設定・定義を参照するの権限を無効にすることでアクセス不可になります。(基本的に設定・定義を参照するの権限は管理者用の権限です。)
権限除外により歯車アイコンが非表示になり、管理者用のユーザの詳細ページへのアクセスが不可になります。
ユーザオブジェクトにカスタム項目を用意してApex経由で一般ユーザが更新するというケースはあまり無い気もしますが、もし必要になる場合は上記のように権限周りについての考慮が必要になります。