我的列表中存储了 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);
}
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