Apex trigger有兩種類型:before trigger和after trigger策州。在多數(shù)情況下淋淀,before trigger和after trigger可以互相替代使用性宏,但也有一些情況下踩验,它們不能相互替代。在這篇筆記中我們就來分析下before trigger與after trigger的異同亮瓷。
一琴拧、基礎(chǔ)知識(shí)
在正式開始前,我們先回顧下Apex trigger的基礎(chǔ)知識(shí)嘱支。
- trigger(觸發(fā)器)允許我們?cè)趕alesforce記錄發(fā)生改變后執(zhí)行某些操作蚓胸。定義一個(gè)trigger的語法如下:
trigger TriggerName on ObjectName (trigger_events) {
//code_block
}
其中挣饥,trigger_events的值可以是:
- before insert
- before update
- before delete
- after insert
- after update
- after delete
- after undelete
- 所有觸發(fā)器都定義了允許開發(fā)人員訪問運(yùn)行時(shí)記錄的隱式變量。這些隱式變量可以幫助我們更好地對(duì)數(shù)據(jù)進(jìn)行操作沛膳。
變量 | 用途 |
---|---|
isInsert | 如果trigger是由于插入操作而觸發(fā)的扔枫,則返回true。 |
oldMap | 返回Id和舊記錄的map集合锹安,只在update和delete trigger中有效短荐。 |
old | 返回舊記錄的列表,只在update和delete trigger中有效叹哭。 |
…… | 更多請(qǐng)參考官方文檔Trigger Context Variables |
- trigger有兩種類型:before trigger和after trigger忍宋。
- before trigger:在記錄保存到數(shù)據(jù)庫之前對(duì)記錄進(jìn)行更新或驗(yàn)證。
- after trigger:訪問由系統(tǒng)設(shè)置的字段值(例如記錄的Id或LastModifiedDate字段)风罩,并影響其他記錄中的更改糠排。After trigger的記錄是只讀的。
二超升、before trigger與after trigger
before trigger
對(duì)于before trigger入宦,記錄還尚未保存到數(shù)據(jù)庫中,因此室琢,不能對(duì)記錄做查詢操作乾闰,例如:List<Account> accList = [Select Id, Name From Account Where Id in :Trigger.New]是錯(cuò)誤的。此外盈滴,Before trigger的好處是你可以改變Trigger.New的值涯肩,而不用借助DML操作。
after trigger
對(duì)于after trigger巢钓,記錄已經(jīng)保存到數(shù)據(jù)庫宽菜,所以你可以對(duì)記錄做查詢。但是竿报,你不能試圖改變Trigger.New的值铅乡,否則就會(huì)報(bào)錯(cuò):System.FinalException: Record is read-only。如果你一定要改變數(shù)據(jù)的值烈菌,你就得構(gòu)造一個(gè)list阵幸,再做DML操作。例如:
List<Account> accList = new List<Account>();
for(Account acc: Trigger.New)
{
Account newAcc = new Account();
newAcc.Id = acc.Id;
newAcc.Name = acc.Name + 'Test'
accList.add(newAcc);
}
update accList;
看完上面的內(nèi)容芽世,你對(duì)before trigger和after trigger就有了初步的了解挚赊,但你可能還是不知道什么時(shí)候該用什么。別著急济瓢!一張圖告訴你答案:
所以荠割,啥時(shí)候應(yīng)該用after trigger呢?上圖告訴我們,當(dāng)你在插入記錄并且需要使用記錄ID時(shí)蔑鹦,用after trigger夺克!其他時(shí)候直接用before trigger。
事實(shí)上嚎朽,95%的trigger都是before trigger铺纽,因?yàn)樗?jiǎn)單,但當(dāng)你需要使用記錄ID時(shí)哟忍,就不得不用after trigger了狡门。
參考:
http://sfdcinpractice.com/index.php/2017/01/09/3-6-difference-trigger/
http://www.sfdc99.com/2014/01/25/use-vs-triggers/
題外話:最近忙到不可開交,好累嗚嗚嗚~~ 大晚上的碼字不易锅很,喜歡記得點(diǎn)贊^ O ^