Salesforceで、重複ルールという機能があります。(前はなかったのですが、とても欲しかった機能でした。実装されてちょっと嬉しかったです)
重複ルールの設定次第では、重複レコードが他にあった際に警告を出しつつそのまま保存ができます。
この設定にした際の、API実装や、データローダやApexで気をつけないといけない点になります。
API実装で、重複レコードの場合に保存する方法
SOAPHeaderに、DuplicateRuleHeaderを指定する。DuplicateRuleHeaderではallowSaveをtrueにする。
PartnerConnection pcon = Connector.newConnection(connectorConfig);
pcon.setDuplicateRuleHeader(true, false, true);
この指定をすることで、エラーとならずに保存ができます。
ETLツールでもSOAPHeaderの指定が可能であればこの設定ができると思います。
指定しない場合allowSaveの初期値はfalseなので、常にエラーとなります。
そして、APIには、事前に重複ルールに該当するか調べるメソッドPartnerConnection.findDuplicatesが用意されています。PartnerConnection.findDuplicatesでは、データ登録前に重複データあるか、ある場合の重複する他のデータを取得することができます。
SObject sobj = new SObject();
sobj.setType("Sample__c");
sobj.setField("KeyField__c", "Value01");
FindDuplicatesResult[] result = pcon.findDuplicates(new SObject[]{sobj});
データローダでは、重複レコードの場合は無条件で登録できない
データローダでは、DuplicateRuleHeaderが指定できない(APIVer40時点)ため、重複ルールで該当すると無条件でエラーとなります。
データローダではエラーではなく登録させたい場合は、重複ルールの条件に工夫が必要となります。
例えば、データローダを利用するユーザのプロファイルやロールを重複ルールの条件に追加することで、そのユーザでは登録ができるようにする対応を行います。
ApexではDMLOptionで指定する
Apexで重複ルールに該当しても、そのまま登録するにはDMLOptonの指定を行います。
Database.DMLOptions dml = new Database.DMLOptions();
dml.DuplicateRuleHeader.allowSave = true;
dml.DuplicateRuleHeader.runAsCurrentUser = true;
Account duplicateAccount = new Account(Name='duplicate');
Database.SaveResult sr = Database.insert(duplicateAccount, dml);
最後に
重複ルールを使う場合、標準画面のチェックが便利になった分、それ以外の考慮が必要になります。データ連携があるシステムでは、データ連携への影響を検討が必要ですし、そのオブジェクトを利用するVisualforceページを作成する場合は、そのVisualforceページの動きの確認が必要です。