问题
现有一个batch job用于批量更新Lead,最近频繁收到apex exception email, 显示更新Lead的时候触发了validation rule,导致apex job运行失败。
batch class节选如下:
public void execute(Database.BatchableContext bc, List<Lead> scope) {
for (Lead l : scope) {
l.Assigned_SDR__c = null;
l.Lead_Category__c = null;
}
update scope;
}
影响评估
假如当前批次需要更新5条Lead,其中仅有1条Lead触发了validation rule。那么上述代码执行时,5条记录都不会被更新;同时,由于没做try catch处理,订阅exception email后会收到apex exception通知。
目标
为确保batch job不受脏数据都影响,我们需要绕过validation rule。
解决方案
方案Overview:
- 在Lead对象上增加2个字段
Automation_Bypass__c
和Automation_Timestamp__c
- 在Validation Rule中引用条件判断是否需要
Automation_Bypass__c
- 在Batch Class更新Lead的时候,将now赋值给
Automation_Timestamp__c
关键字段如下图:
调整后的batch class节选如下:
public void execute(Database.BatchableContext bc, List<Lead> scope) {
Datetime now = System.now();
for (Lead l : scope) {
l.Assigned_SDR__c = null;
l.Lead_Category__c = null;
// Bypass Lead Validation Rules to guard against invalid data. Users needs to manually fix data
l.Automation_Timestamp__c = now;
}
update scope;
}
这样,我们就可以确保自动更新Lead的5s内validation rule将会被绕过,5s后当业务人员编辑Lead,validation rule将会再次被enforce,需要业务人员修复脏数据问题。
达成效果
开发人员
不用在意脏数据对代码的考验业务经理
不用承受批量修复数据的压力业务人员
仅在需要的时候顺手修复数据