Salesforce提交RMA时触发触发器递归更新错误求助
问题详情
使用Case对象提交RMA时触发错误,完整错误栈如下:
CCS_AS400_Integration: execution of BeforeUpdate caused by: System.DmlException: Insert failed. First exception on row 0; first error: CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY, CCS_AS400_Line_Import: execution of AfterInsert caused by: System.DmlException: Update failed. First exception on row 0 with id 500Nu000003yy4SIAQ; first error: SELF_REFERENCE_FROM_TRIGGER, Object (id = 500Nu000003yy4S) is currently in trigger CCS_AS400_Integration, therefore it cannot recursively update itself: [] Trigger.CCS_AS400_Line_Import: line 17, column 1: [] Class.CCS_Line_Item_Manager.consolidateLineItems: line 138, column 1 Trigger.CCS_AS400_Integration: line 156, column 1
已尝试更新触发器代码,但问题仍未解决,请求技术支持。
可行解决方向
- 添加递归控制标志:在触发器处理类中设置静态布尔变量,标记当前是否正在执行核心逻辑,避免递归触发。示例代码:
public class CCS_AS400_Integration_Handler { private static Boolean isProcessing = false; public static void handleBeforeUpdate(List<Case> caseList) { if (!isProcessing) { isProcessing = true; try { // 原触发器业务逻辑 } finally { isProcessing = false; } } } } - 调整触发逻辑链路:问题根源是
CCS_AS400_Integration触发器插入记录后,触发CCS_AS400_Line_Import的AfterInsert逻辑,后者调用consolidateLineItems更新原Case对象,形成递归。需修改逻辑,避免在AfterInsert上下文直接更新触发源Case。 - 改用异步处理:将对Case的更新逻辑移到
@future或Queueable异步方法中,脱离当前触发器上下文,绕过递归限制。 - 优化触发条件:在触发器中增加字段判断,仅当Case的RMA状态或关键字段发生实际变化时,才执行后续插入、更新逻辑,减少不必要的触发。
内容的提问来源于stack exchange,提问作者Bhavik Patel

