Development questions
Write a trigger on User: whenever a new active User is created in a specific role, automatically assign them a specific PermissionSet and add them to a Public Group (handling Mixed DML via @future).
User is a setup object, so assigning a PermissionSet (PermissionSetAssignment) or public group membership (GroupMember) in the same transaction as non-setup DML can cause Mixed DML. Do the work in a @future method (or Queueable).
apex
trigger UserTrigger on User (after insert) {
Set<Id> ids = new Set<Id>();
for (User u : Trigger.new) if (u.IsActive && u.UserRoleId == Label_RoleId) ids.add(u.Id);
if (!ids.isEmpty()) UserHandler.assignAccess(ids);
}
public class UserHandler {
@future
public static void assignAccess(Set<Id> userIds) {
Id psId = [SELECT Id FROM PermissionSet WHERE Name = 'Sales_Ops' LIMIT 1].Id;
Id gId = [SELECT Id FROM Group WHERE DeveloperName = 'Deal_Desk' AND Type = 'Regular' LIMIT 1].Id;
List<PermissionSetAssignment> psa = new List<PermissionSetAssignment>();
List<GroupMember> gms = new List<GroupMember>();
for (Id uid : userIds) {
psa.add(new PermissionSetAssignment(AssigneeId = uid, PermissionSetId = psId));
gms.add(new GroupMember(UserOrGroupId = uid, GroupId = gId));
}
insert psa; insert gms;
}
}
(Label_RoleId stands for the role Id, e.g. from a custom label or query.)
apex-triggertriggercodingscenariomixed-dml
More Development questions
- What is an Apex Trigger in Salesforce and when should you use it over Flows?
- What is the difference between before triggers and after triggers?
- Explain all Trigger context variables (isInsert, isUpdate, isDelete, isUndelete, isBefore, isAfter, isExecuting, size, operationType).
- What is the difference between Trigger.new and Trigger.old?
- In which trigger events are Trigger.new and Trigger.newMap available?
- In which trigger events are Trigger.old and Trigger.oldMap available?