Salesforce 在批量 DML 中设置密码错误

问题描述 投票:0回答:1

我的列表中存储了 500 个用户帐户。

我想将他们的密码设置为特定字符串。我的代码运行良好,但当列表大于 150 时,它会生成 DML 错误。我需要解决此错误并一次性为所有 500 个用户设置密码。任何帮助将不胜感激。

我已经尝试过这段代码,它在用户 151 之前都可以正常工作。

List<User> userList = [SELECT Id from User WHERE IsActive = true];
for(User usr : userList) {
    System.setPassword(usr.Id, 'xxxxxxxx');
    System.debug('DONE: ' + usr.Id);
}
salesforce apex
1个回答
0
投票

setPassword
比较特殊,消耗1条DML语句,超出150条限制,一次只能调用1个用户。

您可以从设置 UI 批量重置组织中所有用户的密码(但这将发送通行证重置电子邮件,不会设置密码)。或者将您的脚本切成 4 个块,一次 150 个用户。

尝试这样的事情:

Integer cutoff = Limits.getLimitDMLStatements(); // 150
Integer offset = 0;

List<User> userList = [SELECT Id, Name
FROM User
WHERE IsActive = true AND Name NOT IN ('Automated Process', 'System')
ORDER BY Id ASC
LIMIT :cutoff
OFFSET :offset];
for(User usr : userList) {
    System.debug(usr);
    System.setPassword(usr.Id, 'abcd1234!');
}
System.debug('Done, increase the "offset" by ' + cutoff + ' and rerun');
Assert.fail('all good, just trying it out');

如果这工作正常,“只是”抛出最后一个异常 - 您可以重新添加此行并真正运行它。 可能有其他系统用户拒绝更改密码(站点/社区来宾用户,如果有的话;启用了单点登录的用户),我建议首先在沙箱中进行试验。您可以在查询中过滤掉它们,或者将

setPassword
包装在 try-catch 中。

您可以在此处找到有关

OFFSET
的更多信息:https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_select_offset.htm

© www.soinside.com 2019 - 2024. All rights reserved.