Triggers 防止批量插入时出现重复值(Salesforce)

Triggers 防止批量插入时出现重复值(Salesforce),triggers,duplicates,salesforce,apex-code,bulk,Triggers,Duplicates,Salesforce,Apex Code,Bulk,我需要一个触发器,它接收来自用户的数据,批量加载大约1000条记录,并将它们存储在Salesforce数据库中。问题是,用户可以在Trigger.new中多次出现,甚至在不同的批中出现。自定义对象名为CBK_User,具有名为User_ID的唯一外部_ID。在我的代码中,我检查数据库中是否还不存在用户: Map<String, CBK_User__c> users = new Map<String,CBK_User__c> ([select Id, USER_I

我需要一个触发器,它接收来自用户的数据,批量加载大约1000条记录,并将它们存储在Salesforce数据库中。问题是,用户可以在Trigger.new中多次出现,甚至在不同的批中出现。自定义对象名为CBK_User,具有名为User_ID的唯一外部_ID。在我的代码中,我检查数据库中是否还不存在用户:

Map<String, CBK_User__c> users = new Map<String,CBK_User__c> 
    ([select Id, USER_ID__c from CBK_User__c where USER_ID__c in : userIds]);

如何防止批量插入时出现重复值?

我已将您的问题调整为练习2:铅重复预防

您应该首先从重复的条目中清除新列表,然后从数据库中现有的条目中清除

     trigger CBK_UserDuplicatePreventer on CBK_User__c (before insert, before update) {
        //Enter a map declaration to hold records which we will add,
        // this will become a unique map, no duplicate values within it.
        Map<String, CBK_User__c> cbkUserMap = new Map<String, CBK_User__c>();

        //The next few lines loop across the array of records that are passed into 
        //the trigger in bulk fashion from any API or User Interface database operation.
        //The goal of this loop is to ensure that there are no duplicates within 
        //the batch that we have received and to gather a list of externalIds that we will use later
        for (CBK_User__c cbkUser : System.Trigger.new) {

            /* Make sure we don't treat an externalId that
               isn't changing during an update as a duplicate. */
            if ((cbkUser.USER_ID__c != null) && (System.Trigger.isInsert ||
 (cbkUser.USER_ID__c != System.Trigger.oldMap.get(cbkUser.Id).USER_ID__c))) {

                // Make sure another new CBK_User__c isn't also a duplicate
                if (cbkUserMap.containsKey(cbkUser.USER_ID__c)) {
                    cbkUser.USER_ID__c.addError('Another new CBK_User__c has the same USER_ID.');
                } else {
                    cbkUserMap.put(cbkUser.USER_ID__c, cbkUser);
                }
            }
        }

        // Using a single database query, find all the CBK_User__c in
        // the database that have the same USER_ID as ANY
        // of the CBK_User__c being inserted or updated. */
        for (CBK_User__c cbkUser : [SELECT USER_ID__c FROM CBK_User__c WHERE USER_ID__c IN :cbkUserMap.KeySet()]) {
            CBK_User__c newCbkUser = cbkUserMap.get(cbkUser.USER_ID__c);
            newCbkUser.USER_ID__c.addError('A CBK_User__c with this USER_ID already exists.');
        }
    }

谢谢你的快速回答!这解决了重复_值的问题,但现在我得到以下错误:无法锁定_行:无法以独占方式访问此记录。我认为这是因为两个或多个批次试图同时处理同一用户,您知道如何解决此问题吗?最后,我找到了无法锁定行问题的解决方案,我在作业属性中设置了concurrencyMode=Serial。这使得批处理逐个运行,而不是并行运行。
     trigger CBK_UserDuplicatePreventer on CBK_User__c (before insert, before update) {
        //Enter a map declaration to hold records which we will add,
        // this will become a unique map, no duplicate values within it.
        Map<String, CBK_User__c> cbkUserMap = new Map<String, CBK_User__c>();

        //The next few lines loop across the array of records that are passed into 
        //the trigger in bulk fashion from any API or User Interface database operation.
        //The goal of this loop is to ensure that there are no duplicates within 
        //the batch that we have received and to gather a list of externalIds that we will use later
        for (CBK_User__c cbkUser : System.Trigger.new) {

            /* Make sure we don't treat an externalId that
               isn't changing during an update as a duplicate. */
            if ((cbkUser.USER_ID__c != null) && (System.Trigger.isInsert ||
 (cbkUser.USER_ID__c != System.Trigger.oldMap.get(cbkUser.Id).USER_ID__c))) {

                // Make sure another new CBK_User__c isn't also a duplicate
                if (cbkUserMap.containsKey(cbkUser.USER_ID__c)) {
                    cbkUser.USER_ID__c.addError('Another new CBK_User__c has the same USER_ID.');
                } else {
                    cbkUserMap.put(cbkUser.USER_ID__c, cbkUser);
                }
            }
        }

        // Using a single database query, find all the CBK_User__c in
        // the database that have the same USER_ID as ANY
        // of the CBK_User__c being inserted or updated. */
        for (CBK_User__c cbkUser : [SELECT USER_ID__c FROM CBK_User__c WHERE USER_ID__c IN :cbkUserMap.KeySet()]) {
            CBK_User__c newCbkUser = cbkUserMap.get(cbkUser.USER_ID__c);
            newCbkUser.USER_ID__c.addError('A CBK_User__c with this USER_ID already exists.');
        }
    }