Trigger触发器常见问题

列举一些比较重要的点,有新增会更新:

1.更新对象本身时使用注意事项:

案例需求:对象ObjA与对象ObjeB,对想ObjA在新增记录时会与ObjB进行匹配,然后更新ObjB的状态与ObjA的状态。

对于以上需求,我们定然需要通过已有的A对象的匹配值作为条件去查询B对象的所有记录,我在编写改代码的时候最终对对象A与B都执行了Update ,使用的是before触发器。

//更新对象A
if(ObjAs.size()>0){
	update ObjAs;
}
//更新对象B
if(ObjBs.size()>0){
	update ObjBs;
}

于是乎就报错了,提示无法更新。于是我更换成after触发器,给出了相同的报错信息。于是我就觉得很奇怪,为什么无法更新?

那么问题在于我这里不应该去对对象A再次执行DML操作,于是我查阅了相关资料,发现,before触发器中,可以通过重新赋值直接更新,不需要进行DML操作。于是注释掉 update ObjAs;于是就没有报错了,对象A也可以正常得到更新。

2.对于问题1,如果我将before替换为after,如何更新呢

测试:
更新CustomsDeclaration__c

public static void selfUp(List<CustomsDeclaration__c> newList){
        List<CustomsDeclaration__c> ccds = new List<CustomsDeclaration__c>();
        if(Trigger.isUpdate){
            for(CustomsDeclaration__c cd:newList){
                cd.Name = 'test2';
                ccds.add(cd);
            }
            update ccds;
        }
    }

报错:
在这里插入图片描述
更改代码:

    public static void selfUp(List<CustomsDeclaration__c> newList){
        //List<CustomsDeclaration__c> ccds = new List<CustomsDeclaration__c>();
        if(Trigger.isUpdate){
            for(CustomsDeclaration__c cd:newList){
                cd.Name = 'test2';
            }
        }
    }

将beforeTrigger更改为afterTrigger
执行以上代码,仍然不会报错。
所以Trigger.new 这与Before和after并无关系,只是在Trigger.new中对对象本身是不需要使用DML操作的。

3.避免trigger的触发

可以新建复选框字段CheckBox ,判断TRUE OR FALSE 的方式去控制是否触发Trigger

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值