Professional Documents
Culture Documents
A trigger is an Apex script that executes before or after changes occur to salesforce
records. These changes include operations like Insert, Update, Delete, Undelete,
Upsert.
Types Of Triggers:
A trigger is Apex code that executes before or after the following types of operations:
● insert
● update
● delete
● upsert
● undelete
Variable Usage
The following are lists of considerations about actions of different trigger events:
Not allowed. A
runtime error is
thrown.
beforedelete Allowed. Not allowed.
trigger.new is not
available before
delete triggers.
Not allowed. A
runtime error is Not applicable. Not applicable.
thrown. The object has The object has
afterdelete
trigger.new is not already been already been
available after deleted. deleted.
delete triggers.
Not allowed. A
Allowed, but
runtime error is
unnecessary. The
thrown. trigger.old
afterundelete Allowed. object is deleted
is not available
immediately after
after undelete
being inserted.
triggers.
Insert Operation Before Insert:
● This trigger will be fried when a new record is going to be saved in the
database.
● In before insert, trigger. New stores a new list of records which is going to be
inserted.
Example
{
Set<String> lastName = new Set<String>();
lastName.add(con.lastname);
setname.add(con.lastName);
if(Trigger.isInsert||Trigger.isUpdate)
for(contact a:trigger.new)
if(setname.contains(a.lastName))
After Insert
● After insert trigger will be fired after new record inserted successfully in
database.
● New is going to hold a new record which is inserted into the database.
● After insert trigger is read only operation. We can do DML operations on new
records which are inserted into the database.
{
for(Account acc: Trigger.new)
{
Account oldAcc = Trigger.oldMap.get(acc.Id);
if(oldAcc.phone != acc.phone)
{
List<Contact> conList = [ SELECT Id, AccountId, phone from Contact where AccountId
= :acc.Id];
List<Contact> newids = new List<Contact>();
for(Contact con: conList)
{
if(con.phone != acc.phone)
{
con.phone = acc.phone;
newids.add(con);
}
}
if (!newids.isEmpty())
{
update newids;
}
}
}
}
● Before update
● After Update
Before Update
It’s going to store the set record before updating to the database.
{
list<account> acclist = new list<account>();
for(contact acc:trigger.old){
account c = new account();
c.Name=acc.lastname;
c.Phone=acc.phone;
acclist.add(c);
}
insert acclist;
}
After update
● After the update trigger will be fired when the changes that we have made are
saved to the database.
● In the after update trigger operation we can only read the data from trigger.
● If we want to make any changes we need to perform DML operation.
Example
{
if(trigger.IsAfter && trigger.IsUpdate){
Set<Id> ids = new Set<Id>();
List<Contact> conlist = new List<Contact>();
for(account a:trigger.new){
ids.add(a.id);
List<Contact> con =[select id,phone,lastName,account.phone from
contact where accountid in:ids];
for(contact c:con){
c.Phone=c.account.phone;
conlist.add(c);
}
update conlist;
}
}
}
● Before Delete
● After Delete
Trigger. Old
This is going to hold the records which are going to be deleted. These records are
read only by operation.
{
for(Account Acc:trigger.old)
{
acc.Name.addError('Account cannot be deleted');
}
}
After Undelete
● When we are undeleting records from the recycle bin after undeleting
operation required.
● New is going to store the record which is undeleting from the recycle bin.
Trigger.oldMap
A map of IDs to the old version of the sObject records. Note that this map is only
available in update and delete triggers.
{
Map<Id,Account> accMap = new Map<Id,Account>();
accMap = trigger.oldMap;
for(account acc : trigger.new)
{
account oldvalue = new account();
oldvalue = accMap.get(acc.Id);
if(acc.phone != oldvalue.phone)
{
acc.phone.addError('Phone cannot be changed');
}
}
}
Trigger.newMap:
A map of IDs to the new version of the sObject records. Note that this map is only
available in before update, after insert and after update triggers.
{
if(trigger.isbefore && trigger.isupdate){
Map<Id,Account> mapcon = trigger.newmap;
List<Contact> cont = new List<Contact>();
List<Contact> con = [select id,phone,accountid from contact where
accountid in : mapcon.keyset()];
for(contact c : con){
c.phone = mapcon.get(c.accountid).phone;
cont.add(c);
}
update cont;
}}
trigger AccountTrigger on Account (before insert, after insert, before update, after update,
before delete, after delete, after undelete) {
If(trigger.isInsert){
If(trigger.isBefore){
System.debug('Before---> NewList'+Trigger.New);
System.debug('Before---> OldList'+Trigger.Old);
System.debug('Before---> NewMap'+Trigger.NewMap);
System.debug('Before---> OldMap'+Trigger.OldMap);
}
If(trigger.isAfter){
System.debug('After---> NewList'+Trigger.New);
System.debug('After---> OldList'+Trigger.Old);
System.debug('After---> NewMap'+Trigger.NewMap);
System.debug('After---> OldMap'+Trigger.OldMap);
}
}
If(trigger.isUpdate){
If(trigger.isBefore){
System.debug('Before---> NewList'+Trigger.New);
System.debug('Before---> OldList'+Trigger.Old);
System.debug('Before---> NewMap'+Trigger.NewMap);
System.debug('Before---> OldMap'+Trigger.OldMap);
}
If(trigger.isAfter){
System.debug('After---> NewList'+Trigger.New);
System.debug('After---> OldList'+Trigger.Old);
System.debug('After---> NewMap'+Trigger.NewMap);
System.debug('After---> OldMap'+Trigger.OldMap);
}
}
If(Trigger.isDelete){
If(trigger.isBefore){
System.debug('Before---> NewList'+Trigger.New);
System.debug('Before---> OldList'+Trigger.Old);
System.debug('Before---> NewMap'+Trigger.NewMap);
System.debug('Before---> OldMap'+Trigger.OldMap);
}
If(trigger.isAfter){
System.debug('After---> NewList'+Trigger.New);
System.debug('After---> OldList'+Trigger.Old);
System.debug('After---> NewMap'+Trigger.NewMap);
System.debug('After---> OldMap'+Trigger.OldMap);
}
}
If(Trigger.isUnDelete){
If(trigger.isAfter){
System.debug('After---> NewList'+Trigger.New);
System.debug('After---> OldList'+Trigger.Old);
System.debug('After---> NewMap'+Trigger.NewMap);
System.debug('After---> OldMap'+Trigger.OldMap);
}
}