触发现有数据的触发器?

时间:2012-06-12 13:22:27

标签: salesforce apex-code

设定:

A - < B> - C.在A上,B上有一个RFS,然后有一个更新后的触发器,当运行时填充B上的字段。然后将B的一个字段汇总到C上的字段中。

问题:

触发器有效,但我需要在数据库中的现有记录上运行它以使所有内容保持最新。我怎么做?我已经尝试用A和C上的RFS进行“力量重新计算”。

3 个答案:

答案 0 :(得分:7)

您可以编写相当简单的Batch Apex (see docs)作业类来触摸要重新计算的所有记录:

global class TouchRecords implements Database.Batchable<sObject>{
    private String query;

    global TouchRecords(String query) {
        this.query = query;
    }

    global Database.QueryLocator start(Database.BatchableContext BC){
        return Database.getQueryLocator(query);
    }

    global void execute(Database.BatchableContext BC, List<sObject> scope){
        update scope;
    }

    global void finish(Database.BatchableContext BC){
    }
}

然后可以通过运行以下命令来执行作业(例如通过执行匿名):

Id batchInstanceId = Database.executeBatch(new TouchRecords('select id from A__c'));

Id batchInstanceId = Database.executeBatch(new TouchRecords('select id from Contact'));

触摸所有联系人

这应该触发所有被触摸的记录(支持最多5000万条记录)。与提议的数据加载器解决方案相同,但保留在SFDC内以便于重用

答案 1 :(得分:2)

找到解决方法。

使用数据加载器 - 在Id和更新上执行导出。这将更改上次修改日期,并导致触发后更新触发器。

答案 2 :(得分:0)

更好的方法是在对象上创建一个虚拟字段,然后对该字段进行批量更新。这可能存在进一步的问题,因此您可能希望将批量大小减少到一个数字,以便在执行任何DML时不会出现SOQL调控器限制。