是否可以在任何对象上实现触发器以防止在批量插入操作期间插入重复记录?此解决方案应解决两种情况:第一,当数据库中已存在重复记录时;第二,当要插入的集合中存在重复记录时。触发器还应在插入过程中显示错误消息,同时允许成功插入包含重复项的集合中的第一条记录。
我已经实现了一个解决方案,但我的理解是,即使使用触发器,如果单个记录重复,也会导致整个插入过程中止。这意味着除非我使用 database.insert 并将标志设置为 false,否则不会插入任何记录。但是,即使在这种情况下,仍然会显示错误,这仍然是个问题吗?这是我的解决方案:
trigger FindDuplicate on Contact (before insert) {
Set<String>emailIdToBeInserted = new Set<String>();
List<Contact>existingContact = new List<Contact>();
Set<String>existingEmail = new Set<String>();
Set<String>processed = new Set<String>();
Set<Id>contactId = new Set<Id>();
if(Trigger.isBefore && Trigger.isInsert){
for(Contact cc:Trigger.new){
if(!emailIdToBeInserted.contains(cc.Email)){
emailIdToBeInserted.add(cc.Email);
}else{
cc.IsDuplicate__c = true;
}
}
existingContact = [Select Id,Email from Contact Where Email IN:emailIdToBeInserted];
for(Contact ecc:existingContact){
existingEmail.add(ecc.Email);
}
for(Contact ctc:Trigger.new){
if(existingEmail.contains(ctc.Email) || processed.contains(ctc.Email)){
ctc.Email.addError('Duplicate Email Address found');
}else{
processed.add(ctc.Email);
}
}
}
}
如果这个方法不可行,根本原因是什么?此外,虽然某些方面可能看起来很简单,但我还应该考虑哪些其他因素?
我假设您使用数据加载器。 为什么不使用重复检测功能?它检测重复项并在检测到时继续处理插入的剩余记录。