- リンクを取得
- ×
- メール
- 他のアプリ
Salesforce開発や運用中に、「duplicate value found:
<unknown>
duplicates value on record with id: <unknown>
」というエラーが発生することがあります。このエラーは、原因の特定が難しいため、デバッグが困難です。本記事では、このエラーの主な原因と対処法を詳しく解説します。エラーの背景
このエラーは通常、以下のいずれかの状況で発生します:
一意性制約(ユニーク制約)違反
- Salesforceのデータベースで特定のフィールドに一意性制約が設定されている場合、新しいレコードまたは更新されたレコードが既存データと重複しているときに発生します。
データインサートまたは更新時のトリガーやフローの影響
- トリガーやフローで、他のオブジェクトに対して間接的に操作が行われた際に、意図せず重複エラーが発生する可能性があります。
内部的な重複管理ルール
- Salesforceの重複管理ルールが原因で、データがブロックされる場合があります。
デバッグ方法
トランザクションの実行ログを確認
- デバッグログを有効化して詳細情報を収集します。
- ログ内で「DML操作」を特定し、どのレコードまたはフィールドが原因かを探します。
一意性制約を確認
- オブジェクトに定義された一意性制約(ユニーク制約)の一覧を確認します。特に`External Id`または`Unique`が設定されているフィールドをチェックしてください。
重複管理ルールを確認
- 設定 → 重複管理ルールから、影響を受けるオブジェクトのルールを確認します。該当するルールが有効であれば、一時的に無効化することで問題を切り分けられます。
トリガーとフローを精査
- データ操作に関連するトリガーやフローが、どのように動作しているかを確認します。
- 特定の条件下で意図しない重複レコードが作成されていないかを調査します。
コードサンプル:デバッグログを活用する方法
以下は、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);
解決方法
一意性制約を見直す
- ユニークフィールドの要件を再確認し、不要な制約があれば削除します。
重複管理ルールのチューニング
- 必要に応じて、重複管理ルールを緩和またはカスタマイズします。
トリガーやフローの修正
- 間接的なDML操作が意図した結果を生んでいるかを確認し、必要に応じて修正します。
まとめ
「duplicate value found: <unknown>
」エラーは、一意性制約や重複管理ルールが主な原因です。正確な原因を特定するためには、ログの確認、ルールの精査、そして関連プロセスの見直しが重要です。本記事で紹介したデバッグ方法を活用し、このエラーを効率的に解決してください。
コメント
コメントを投稿