Ad Code

✨🎆 JOIN MERN, JAVA, PYTHON, AI, DEVOPS, SALESFORCE Courses 🎆✨

Get 100% Placement Oriented Program CLICK to new more info click

Trigger in salesforce | What is Trigger

Salesforce Trigger – Complete Beginner Friendly Guide

This tutorial demonstrates all types of Salesforce Triggers using a simple custom object example.


Assumptions

  • Custom Object: Branch__c
  • Field: Branch_Name__c (Text)

1. Basic Trigger Syntax

A trigger runs automatically when a record is inserted, updated, deleted, or restored.


trigger BranchTrigger on Branch__c (
    before insert, before update,
    after insert, after update,
    before delete, after delete,
    after undelete
) {
    // Trigger logic
}

Key Points:

  • Trigger.new → New records
  • Trigger.old → Old records
  • Trigger.oldMap → Old record values by Id

2. BEFORE INSERT Trigger

Use Case: Format Branch Name before saving.


trigger BranchBeforeInsert on Branch__c (before insert) {
    for (Branch__c b : Trigger.new) {
        if (b.Branch_Name__c != null) {
            b.Branch_Name__c = b.Branch_Name__c.toUpperCase();
        }
    }
}

Explanation:

  • Runs before record is saved
  • No DML required
  • Best for validation and formatting
trigger BeforeInsertBranchTrigger on Branch__c (before insert) {
for(Branch__c obj:Trigger.NEW)
{
    obj.Name = 'RAM';
}
}

3. BEFORE UPDATE Trigger

Use Case: Do not allow Branch Name change.


trigger BranchBeforeUpdate on Branch__c (before update) {
    for (Branch__c b : Trigger.new) {
        Branch__c oldB = Trigger.oldMap.get(b.Id);

        if (b.Branch_Name__c != oldB.Branch_Name__c) {
            b.addError('Branch Name cannot be changed');
        }
    }
}

Explanation:

  • Uses Trigger.oldMap to compare values
  • addError() stops record update

4. AFTER INSERT Trigger

Use Case: Modify record after it is saved.


trigger AfterInsertBranchTrigger on BranchMaster__c (after insert) {

    List<BranchMaster__c> branchList = [
        SELECT Id, Name
        FROM BranchMaster__c
        WHERE Id IN :Trigger.new
    ];

    for (BranchMaster__c b : branchList) {
        if (b.Name != null && !b.Name.endsWith(' - INDIA')) {
            b.Name = b.Name + ' - INDIA';
        }
    }

    if (!branchList.isEmpty()) {
        update branchList;
    }
}

Explanation:

  • Record already saved
  • DML operation is required
Another Example 
trigger AfterInsertBranchTrigger on Branch__c (after insert) {

    List<Branch__c> branchList = new List<Branch__c>();

    for (Branch__c obj : Trigger.new) {
        if (obj.BranchID__c == 777) {
            branchList.add(new Branch__c(
                Id = obj.Id,
                Name = 'shyam'
            ));
        }
    }

    if (!branchList.isEmpty()) {
        update branchList;
    }
}

5. AFTER UPDATE Trigger

Use Case: Track Branch Name changes.


trigger BranchAfterUpdate on Branch__c (after update) {
    for (Branch__c b : Trigger.new) {
        Branch__c oldB = Trigger.oldMap.get(b.Id);

        if (b.Branch_Name__c != oldB.Branch_Name__c) {
            System.debug(
                'Branch Name changed from ' +
                oldB.Branch_Name__c +
                ' to ' +
                b.Branch_Name__c
            );
        }
    }
}

Explanation:

  • Used for logging, notifications, integrations

6. BEFORE DELETE Trigger

Use Case: Restrict deletion of important records.


trigger BranchBeforeDelete on Branch__c (before delete) {
    for (Branch__c b : Trigger.old) {
        if (b.Branch_Name__c == 'HEAD OFFICE') {
            b.addError('Head Office branch cannot be deleted');
        }
    }
}

Explanation:

  • Uses Trigger.old
  • addError() prevents deletion

7. AFTER DELETE Trigger

Use Case: Log deleted records.


trigger BranchAfterDelete on Branch__c (after delete) {
    for (Branch__c b : Trigger.old) {
        System.debug('Deleted Branch: ' + b.Branch_Name__c);
    }
}

Explanation:

  • Record already deleted
  • Useful for audit purposes

Real-time example of trigger create branch backup table and it will store the record before update and before delete record and after insert


trigger BranchTrigger on Branch__c (before update,before delete,after insert) {
if(Trigger.isDelete && Trigger.isBefore)
{    
    for(Branch__c b :Trigger.old){
                
                branchbackup__c obj = new branchbackup__c(Name=b.Name,status__c='delete trigger');
                insert obj;
                
            }
}
else if(Trigger.isUpdate && Trigger.isBefore) 
{
     for(Branch__c b :Trigger.old){
              
                branchbackup__c obj = new branchbackup__c(Name=b.Name,status__c='update trigger');
                insert obj;
                
            }
    
    
}
else
{
     for(Branch__c b :Trigger.New){
              
                branchbackup__c obj = new branchbackup__c(Name=b.Name,status__c='insert trigger');
                insert obj;
                
            }
}
}



8. AFTER UNDELETE Trigger

Use Case: Handle record restore from Recycle Bin.


trigger BranchAfterUndelete on Branch__c (after undelete) {
    List<Branch__c> branches = new List<Branch__c>();

    for (Branch__c b : Trigger.new) {
        b.Branch_Name__c = 'RESTORED - ' + b.Branch_Name__c;
        branches.add(b);
    }

    update branches;
}

Explanation:

  • Runs when record is restored
  • Used for audit and notifications

9. Best Practice (Very Important)

Rule: Always create one trigger per object.


trigger BranchTrigger on Branch__c (
    before insert, before update,
    after insert, after update,
    before delete, after delete,
    after undelete
) {
    if (Trigger.isBefore && Trigger.isInsert) {
        // before insert logic
    }
}

10. Trigger Types Summary

Trigger Type When It Runs Use Case
Before Insert Before save Validation, formatting
After Insert After save Updates, notifications
Before Update Before change Validation
After Update After change Logging
Before Delete Before delete Restrict deletion
After Delete After delete Audit
After Undelete After restore Notification

Conclusion:
Triggers are powerful tools in Salesforce to control data and automate processes. Always follow best practices and write clean, bulkified code.

Post a Comment

0 Comments