Vla*_*lme 3 salesforce dml apex-code
我在Contact对象上有一个触发器,当我尝试在此触发器中更新用户记录时,我得到以下异常:
"MIXED_DML_OPERATION,更新非安装对象后,不允许对安装对象进行DML操作(反之亦然):用户,原始对象:联系人"
触发代码:
trigger UpdateContactTrigger on Contact (after update) {
User u = [SELECT Id, IsActive FROM User WHERE IsActive = true];
u.IsActive = false;
update u;
}
Run Code Online (Sandbox Code Playgroud)
从Contact触发器更新用户记录的字段时,如何避免此错误?
Salesforce将对象分类为所谓的设置和非设置对象.用户是安装对象,而联系人是非安装对象.Salesforce限制DML操作,以便不能在同一上下文中操作这两种对象.
有针对此问题将DML代码如本的末尾描述冲突的对象到@Future方法解决方法文件和先前答案.
在我的情况下,使用@future方法不起作用,因为User上有一个更新触发器调用了另一个@future方法,而Salesforce不允许从另一个@future方法调用@future方法.
所以我提出了另一种解决方法,适用于User对象的某些情况.
从API 15.0版开始,Salesforce实际上允许在具有非设置对象更新的相同上下文中更新User对象的自定义字段.因此,如果您需要更新用户的标准字段,则可以在User对象上使用带有"更新前"触发器的自定义代理字段.
如果您需要更改用户的IsActive字段,请向用户添加自定义IsActiveProxy字段,并在其上的触发器中执行更新:
trigger UpdateContactTrigger on Contact (after update) {
User u = [SELECT Id, IsActive FROM User WHERE IsActive = true];
u.IsActiveProxy__c = false;
update u;
}
Run Code Online (Sandbox Code Playgroud)
然后在用户上创建"更新前"触发器,将代理字段值复制到标准字段:
trigger BeforeUpdateUserTrigger on User (before update) {
for(User user : trigger.new) {
if(user.IsActive != user.IsActiveProxy__c) {
user.IsActive = user.IsActiveProxy__c;
}
}
}
Run Code Online (Sandbox Code Playgroud)
而已!它对我有用.
| 归档时间: |
|
| 查看次数: |
7577 次 |
| 最近记录: |