Triggers ContentDocumentLink上的Insert触发器对1条记录运行两次后。如何防止同样的情况?

Triggers ContentDocumentLink上的Insert触发器对1条记录运行两次后。如何防止同样的情况?,triggers,salesforce,apex,salesforce-lightning,Triggers,Salesforce,Apex,Salesforce Lightning,当对ContentDocumentLink的Trigger.new进行迭代时,我试图根据链接到的实体筛选出一些ContentDocumentLink记录。(下面的代码片段。)system.debug显示相同的结果,但在一个毫秒的时间间隔后显示两次。这会导致我的功能运行两次,如何防止同样的情况发生 if(govAgreementIds !=null){ for(ContentDocumentLink att:(List<ContentDocumentLink>)Trig

当对ContentDocumentLink的Trigger.new进行迭代时,我试图根据链接到的实体筛选出一些ContentDocumentLink记录。(下面的代码片段。)system.debug显示相同的结果,但在一个毫秒的时间间隔后显示两次。这会导致我的功能运行两次,如何防止同样的情况发生

if(govAgreementIds !=null){
        for(ContentDocumentLink att:(List<ContentDocumentLink>)Trigger.new){
            if(govAgreementIds.contains(att.LinkedEntityId)){
                finalcdId.add(att.ContentDocumentId);
            }
        }
    }

    System.debug('finalcdId>> '+finalcdId);
if(goveragreementids!=null){
对于(ContentDocumentLink附件:(列表)触发器。新建){
if(govAgreementId.contains(att.LinkedEntityId)){
finalcdId.add(att.ContentDocumentId);
}
}
}
系统调试('finalcdId>>'+finalcdId);
调试日志: 17:08:07:232USER_DEBUG[251]| DEBUG | finalcdId>{0698A000000eg6bQAA} 17:08:08:528USER_DEBUG[251]| DEBUG | finalcdId>{0698A000000eg6bQAA}

可以在多个LinkedEntityId之间共享相同的ContentDocumentId。您的if条件检查LinkedEntityId。同一ContentDocumentId可能有多个linkentity ID。您需要实现如下代码
Same ContentDocumentId can be shared across multiple LinkedEntityId's. your if condition checking LinkedEntityId. There may be multiple linkentity ID's for same ContentDocumentId. You need to implement code as below

if(govAgreementIds !=null){
        for(ContentDocumentLink att:(List<ContentDocumentLink>)Trigger.new){
            if(govAgreementIds.contains(att.LinkedEntityId)){
              if (!finalcdId.contains(att.ContentDocumentId)) { 
                    finalcdId.add(att.ContentDocumentId);
                   }
              }
        }
    }
if(govAgreementId!=null){ 对于(ContentDocumentLink附件:(列表)触发器。新建){ if(govAgreementId.contains(att.LinkedEntityId)){ 如果(!finalcdId.contains(att.ContentDocumentId)){ finalcdId.add(att.ContentDocumentId); } } } }
这是Salesforce的标准行为。 本文档中提到,如果需要更新某些内容,可以在执行工作流规则之前和之后调用触发器两次(更新触发器)(参见第4、8和11c点)

出于某种原因,要解决此问题,请创建一个简单的布尔类变量(“标志”),并使用它来控制/避免第二次执行:

public class HelperClass {
   public static boolean firstRun = true;  
}
trigger affectedTrigger on Account (before delete, after delete, after undelete) {
    if(Trigger.isBefore){
        if(Trigger.isDelete){
            if(HelperClass.firstRun){        // check if running for first time
                Trigger.old[0].addError('Before Account Delete Error');
                HelperClass.firstRun=false;      // falsify the flag to denote it has already run before
            }
        }
    }
}
代码的来源:


希望这有帮助。谢谢。

它仍然没有按预期工作。在调试中,它将出现两次。