function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
MokshadaMokshada 

why trigger giving error as maximum trigger depth exceeded

Hi I have written two triggers on teacher and student like whenever teacher is inserted student should be inserted or vice versa and same for updation and deletion also. but while saving a record I am getting error as :-
TeacherTrigger: execution of AfterInsert caused by: System.DmlException: Insert failed. First exception on row 0; first error: CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY, StudentTrigger: maximum trigger depth exceeded Teacher trigger event AfterInsert Student trigger event AfterInsert Teacher trigger event AfterInsert Student trigger event AfterInsert Teacher trigger event AfterInsert Student trigger event AfterInsert Teacher trigger event AfterInsert Student trigger event
can anyone hep in resolving this can we do like in both the cases afterinsert and after update check with the help of id if trigger is running on teacher then we need to check that if student is not present with that teacher id then only it will create student record.how to do this? can anyone help
code:
trigger StudentTrigger on Student__c (after insert, after update, before delete) {
    if (Trigger.isAfter) {
        if (Trigger.isInsert) {
                List<Teacher__c> teachersToInsert = new List<Teacher__c>();
                
                for (Student__c student : Trigger.new) {
                    Teacher__c teacher = new Teacher__c();
                    teacher.Name = student.Name;
                    teacher.Email__c = student.Email__c;
                    teacher.Mobile__c = student.Mobile__c;
                    teacher.Address__c = student.Address__c;
                    teacher.teacherid__c = student.Id;
                    teachersToInsert.add(teacher);
                }
                
                if (!teachersToInsert.isEmpty()) {
                    insert teachersToInsert;
                }
            }
        
        if (Trigger.isUpdate) {
            List<Teacher__c> teachersToUpdate = new List<Teacher__c>();
            Set<Id> studentIds = new Set<Id>();
            
            for (Student__c student : Trigger.new) {
                studentIds.add(student.Id);
            }
            
            List<Teacher__c> existingTeachers = [SELECT Id, Name, Email__c, Mobile__c, Address__c, teacherid__c FROM Teacher__c WHERE teacherid__c IN :studentIds];
            Map<Id, Teacher__c> teacherMap = new Map<Id, Teacher__c>();
            
            for (Teacher__c teacher : existingTeachers) {
                teacherMap.put(teacher.teacherid__c, teacher);
            }
            for (Student__c student : Trigger.new) {
                if (teacherMap.containsKey(student.Id)) {
                    Teacher__c teacher = teacherMap.get(student.Id);
                    teacher.Name = student.Name;
                    teacher.Email__c = student.Email__c;
                    teacher.Mobile__c = student.Mobile__c;
                    teacher.Address__c = student.Address__c;
                    teachersToUpdate.add(teacher);
                }
            }
            if (!teachersToUpdate.isEmpty()) {
                update teachersToUpdate;
            }
        }
    }
    
    if (Trigger.isBefore) {
        if (Trigger.isDelete) {
            List<String> studentIds = new List<String>();
            for (Student__c student : Trigger.old) {
                studentIds.add(student.Id);
            }
            List<Teacher__c> listOfTeachers = [SELECT Id, teacherid__c FROM Teacher__c WHERE teacherid__c IN :studentIds];
            System.debug('listOfTeachers: ' + listOfTeachers);
            if (!listOfTeachers.isEmpty()) {
                delete listOfTeachers;
            }
        }
    }
}
trigger TeacherTrigger on Teacher__c (after insert, after update, before delete) {
    if (Trigger.isAfter) {
        if (Trigger.isInsert) {
                List<Student__c> studentsToInsert = new List<Student__c>();
                for (Teacher__c teacher : Trigger.new) {
                    Student__c student = new Student__c();
                    student.Name = teacher.Name;
                    student.Email__c = teacher.Email__c;
                    student.Mobile__c = teacher.Mobile__c;
                    student.Address__c = teacher.Address__c;
                    student.id__c = teacher.Id;
                    studentsToInsert.add(student);
                }
                if (!studentsToInsert.isEmpty()) {
                    insert studentsToInsert;
                }
            }
        }
        
        if (Trigger.isUpdate) {
            List<Student__c> studentsToUpdate = new List<Student__c>();
            Set<Id> teacherIds = new Set<Id>();
            for (Teacher__c teacher : Trigger.new) {
                teacherIds.add(teacher.Id);
            }
            List<Student__c> existingStudents = [SELECT Id, Name, Email__c, Mobile__c, Address__c, id__c FROM Student__c WHERE id__c IN :teacherIds];
            Map<Id, Student__c> studentMap = new Map<Id, Student__c>();
            for (Student__c student : existingStudents) {
                studentMap.put(student.id__c, student);
            }
            for (Teacher__c teacher : Trigger.new) {
                    if (studentMap.containsKey(teacher.Id)) {
                        Student__c student = studentMap.get(teacher.Id);
                        student.Name = teacher.Name;
                        student.Email__c = teacher.Email__c;
                        student.Mobile__c = teacher.Mobile__c;
                        student.Address__c = teacher.Address__c;
                        studentsToUpdate.add(student);
                    }
                }
            }
            if (!studentsToUpdate.isEmpty()) {
                update studentsToUpdate;
            }
        }
    }
    
    if (Trigger.isBefore) {
        if (Trigger.isDelete) {
            List<String> teacherIds = new List<String>();
            
            for (Teacher__c teacher : Trigger.old) {
                teacherIds.add(teacher.Id);
            }
            List<Student__c> listOfStudents = [SELECT Id, id__c FROM Student__c WHERE id__c IN :teacherIds];
            System.debug('Number of students found: ' + listOfStudents.size());
            System.debug('listOfStudents' + listOfStudents);
            if (!listOfStudents.isEmpty()) {
                delete listOfStudents;
            }
        }
    }
}
Thanks,
Arun Kumar 1141Arun Kumar 1141

Hi Mokshada,

Normally 'Maximum Trigger depth Exceeded' error comes when a trigger recursively invoke triggers more than 16 times.
So to avoid recursion we have to break the recursive call. One way is to use static boolean variable/flag  whereever your business logic permits.

To slove recursive trigger check out this link 
https://help.salesforce.com/HTViewSolution?id=000199485&language=en_US'

Please mark my solution as the best answer if it helps you.
Thanks.

elixir iraqelixir iraq
Turkish delights and dragee (https://elixiriraq.com/product-category/turkish-delights-and-dragee/) are renowned confections that have delighted sweet enthusiasts for centuries. With their vibrant colors, irresistible flavors, and unique textures, these treats have become emblematic of Turkish culinary traditions. In this article, we will take you on a delightful journey through the history, production, and cultural significance of Turkish delights and dragee.