SalesforceにおけるWebサービスコールアウトのテスト完全ガイド

Salesforceで発生する「duplicate value found: 」エラーのデバッグ方法


Salesforce開発や運用中に、「duplicate value found: <unknown> duplicates value on record with id: <unknown>」というエラーが発生することがあります。このエラーは、原因の特定が難しいため、デバッグが困難です。本記事では、このエラーの主な原因と対処法を詳しく解説します。


エラーの背景

このエラーは通常、以下のいずれかの状況で発生します:

  1. 一意性制約(ユニーク制約)違反

    • Salesforceのデータベースで特定のフィールドに一意性制約が設定されている場合、新しいレコードまたは更新されたレコードが既存データと重複しているときに発生します。
  2. データインサートまたは更新時のトリガーやフローの影響

    • トリガーやフローで、他のオブジェクトに対して間接的に操作が行われた際に、意図せず重複エラーが発生する可能性があります。
  3. 内部的な重複管理ルール

    • Salesforceの重複管理ルールが原因で、データがブロックされる場合があります。

デバッグ方法

  1. トランザクションの実行ログを確認

    • デバッグログを有効化して詳細情報を収集します。
    • ログ内で「DML操作」を特定し、どのレコードまたはフィールドが原因かを探します。
  2. 一意性制約を確認

    • オブジェクトに定義された一意性制約(ユニーク制約)の一覧を確認します。特に`External Id`または`Unique`が設定されているフィールドをチェックしてください。
  3. 重複管理ルールを確認

    • 設定 → 重複管理ルールから、影響を受けるオブジェクトのルールを確認します。該当するルールが有効であれば、一時的に無効化することで問題を切り分けられます。
  4. トリガーとフローを精査

    • データ操作に関連するトリガーやフローが、どのように動作しているかを確認します。
    • 特定の条件下で意図しない重複レコードが作成されていないかを調査します。

コードサンプル:デバッグログを活用する方法

以下は、Apexコード内でエラーをキャッチし、詳細情報をログに記録する例です。

public class DuplicateErrorHandler {
    public static void handleInsert(List<SObject> records) {
        try {
            insert records;
        } catch (DmlException e) {
            for (Integer i = 0; i < e.getNumDml(); i++) {
                if (e.getDmlType(i) == StatusCode.DUPLICATE_VALUE) {
                    System.debug('Duplicate value error on record: ' + records[i]);
                    System.debug('Error message: ' + e.getDmlMessage(i));
                }
            }
            throw e; // 必要に応じて再スロー
        }
    }
}

// サンプル実行
List<Account> accounts = new List<Account> {
    new Account(Name = 'Test Account', ExternalId__c = '12345')
};
DuplicateErrorHandler.handleInsert(accounts);

解決方法

  1. 一意性制約を見直す

    • ユニークフィールドの要件を再確認し、不要な制約があれば削除します。
  2. 重複管理ルールのチューニング

    • 必要に応じて、重複管理ルールを緩和またはカスタマイズします。
  3. トリガーやフローの修正

    • 間接的なDML操作が意図した結果を生んでいるかを確認し、必要に応じて修正します。

まとめ

「duplicate value found: <unknown>」エラーは、一意性制約や重複管理ルールが主な原因です。正確な原因を特定するためには、ログの確認、ルールの精査、そして関連プロセスの見直しが重要です。本記事で紹介したデバッグ方法を活用し、このエラーを効率的に解決してください。

コメント