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).

DevelopmentHardDeloittePwCSalesforce

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