如何以自动化账号身份从Apex调度作业,变更Contact修改人
解决方案
要让调度作业以自动化账号身份修改Contact记录,核心是在执行修改逻辑时切换用户上下文,具体步骤如下:
1. 确保自动化账号具备必要权限
- 给自动化账号分配Contact对象的Read、Edit权限,以及需要修改字段的编辑权限
- 确保调度作业的发起用户(也就是你)能访问该自动化账号(比如通过用户列表可见性设置),若发起用户是普通用户,还需要具备
Manage Users权限(系统管理员默认拥有该权限)
2. 修改Scheduled Apex类的执行逻辑
在SendTwilioSMSNewContacts类的execute方法中,使用System.runAs()方法切换到自动化账号上下文执行修改操作。示例代码如下:
global class SendTwilioSMSNewContacts implements Schedulable { private List<Id> contactIds; // 构造方法 global SendTwilioSMSNewContacts(List<Id> contactIds) { this.contactIds = contactIds; } global void execute(SchedulableContext sc) { // 获取自动化账号(替换为你的自动化账号用户名/唯一标识) User automationUser = [SELECT Id FROM User WHERE Username = 'automation@yourorg.com' LIMIT 1]; // 切换到自动化账号上下文执行修改操作 System.runAs(automationUser) { // 查询需要修改的Contact记录 List<Contact> targetContacts = [SELECT Id, ... FROM Contact WHERE Id IN :contactIds]; // 执行你的修改逻辑 for(Contact c : targetContacts) { c.Last_Name__c = 'UpdatedByAutomation'; // 示例修改字段 } // 更新记录 update targetContacts; } // 可选:删除已完成的调度作业 System.abortJob(sc.getTriggerId()); } }
关键说明
- 原代码中调度作业默认以**发起调度的用户(你)**身份运行,所以修改记录的最后修改人显示为你
System.runAs()会临时切换用户上下文,所有在代码块内的DML操作都会以指定的自动化账号身份执行,因此最后修改人会变为该自动化账号- 注意:
System.runAs()不会改变权限层级,若自动化账号没有对应权限,操作会失败,所以务必提前配置好权限
内容的提问来源于stack exchange,提问作者L P
相关产品推荐
相关产品推荐

