Salesforceエラー「insufficient access rights on cross-reference id」の解決方法


Salesforceエラー「insufficient access rights on cross-reference id」の解決方法

Salesforce開発で「INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY」エラーが発生する場合、主にオブジェクトのアクセス権や共有設定が原因です。この記事では、特にVisualforceページからOpportunityとOpportunity Line Itemを挿入する際に発生するエラーの対処法について詳しく解説します。


問題の背景

エラー内容:
INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY, insufficient access rights on cross-reference id

発生条件:

  • VisualforceページからOpportunityとOpportunity Line Itemを挿入しようとした際にエラーが発生。
  • ユーザーが「Authenticated Website」プロファイルを使用している場合にエラーが再現される。
  • 「Customer Portal Manager」プロファイルでは問題なく動作。

原因:

  1. オブジェクト共有設定:

    • Opportunity: 「読み取り専用」
    • Opportunity Line Item: 「親により制御」
  2. コード実行権限:

    • Apexクラスが「without sharing」で実行される場合、認可された共有ルールが適用されない。
    • これにより、システム権限を超えたアクセスが可能になる。

解決方法

1. ユーザー権限の見直し

  • カスタムプロファイルの作成:
    「Authenticated Website」ユーザー用のプロファイルをカスタマイズし、Opportunityや関連オブジェクトへの必要最小限の権限を付与します。

  • 共有ルール:
    必要に応じて共有ルールを追加して、該当ユーザーがレコードを挿入できるようにします。


2. Apexコードの見直し

without sharingを使うと一時的にエラーが回避されますが、セキュリティ上のリスクが伴います。そこで以下のような方法を検討してください。

例: レコード挿入時にシステム管理者権限を一時的に付与する。

public with sharing class OpportunityController {
    public void insertOpportunityAndLineItem(Opportunity opp, List<OpportunityLineItem> lineItems) {
        // レコード挿入処理
        System.runAs(new User(Id = UserInfo.getUserId())) {
            insert opp;

            for (OpportunityLineItem oli : lineItems) {
                oli.OpportunityId = opp.Id;
            }
            insert lineItems;
        }
    }
}

3. プログラムロジックの見直し

  • トランザクション分割:
    OpportunityとOpportunity Line Itemを別々のトランザクションで挿入することで権限問題を分けて処理します。

例:

public void insertRecords() {
    // Opportunityの挿入
    insert opp;

    // Opportunity Line Itemの挿入
    for (OpportunityLineItem oli : lineItems) {
        oli.OpportunityId = opp.Id;
    }
    insert lineItems;
}

まとめ

エラー「insufficient access rights on cross-reference id」は、共有設定やユーザー権限が正しく構成されていない場合に発生します。上記の方法を活用し、適切な権限設定とApexコードの構成を行うことで、安全かつ効率的なエラー解決が可能です。

コメント