{"id":5640,"date":"2026-06-04T02:57:15","date_gmt":"2026-06-04T02:57:15","guid":{"rendered":"https:\/\/www.cmsgalaxy.com\/blog\/?p=5640"},"modified":"2026-06-04T02:57:15","modified_gmt":"2026-06-04T02:57:15","slug":"moodle-how-to-fix-moodle-cant-find-data-record-in-database-error-in-enrolment-methods-after-deleting-linked-courses","status":"publish","type":"post","link":"https:\/\/www.cmsgalaxy.com\/blog\/moodle-how-to-fix-moodle-cant-find-data-record-in-database-error-in-enrolment-methods-after-deleting-linked-courses\/","title":{"rendered":"Moodle: How to Fix Moodle \u201cCan\u2019t Find Data Record in Database\u201d Error in Enrolment Methods After Deleting Linked Courses"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Managing enrolments in Moodle is usually simple when everything is cleanly configured. But sometimes, after deleting old courses or changing the enrolment structure, Moodle may suddenly start showing this error when opening a course enrolment page:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Can't find data record in database.\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This commonly happens when you go to:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Course \u2192 Participants \u2192 Enrolment methods\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If this error appears only for some courses, there is a strong possibility that those courses still contain broken enrolment references from old <strong>Course meta link<\/strong> enrolment methods.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This tutorial explains why this happens, how to identify the broken records safely, and how to fix the issue properly using Moodle\u2019s own API instead of directly deleting database rows.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Understanding the Problem<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">In Moodle, there are different enrolment methods. Two commonly confused methods are:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Course meta link\nCohort sync\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">They sound similar because both can automatically enrol users, but they work differently.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Course Meta Link<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A <strong>Course meta link<\/strong> enrolment method allows users enrolled in one course to be automatically enrolled into another course.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Course A users \u2192 Course meta link \u2192 Course B\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">In this setup, Course A is the source course. Course B depends on Course A for enrolments.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This method is useful when you want one course to act as a master enrolment source for one or more other courses.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Cohort Sync<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A <strong>Cohort sync<\/strong> enrolment method allows users from a Moodle cohort to be automatically enrolled into a course.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Cohort \u2192 Cohort sync \u2192 Course B\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This is usually better when you want to manage users centrally from one group and attach that group directly to multiple courses.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For large Moodle setups with many courses, Cohort sync is usually cleaner than creating one course just to act as an enrolment source for other courses.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Why the Error Happens<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Suppose earlier you had this structure:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Master Course \u2192 Course meta link \u2192 Course 1\nMaster Course \u2192 Course meta link \u2192 Course 2\nMaster Course \u2192 Course meta link \u2192 Course 3\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Later, you deleted the old <strong>Master Course<\/strong> because you decided to use cohorts directly.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Now Moodle may still have some old <code>meta<\/code> enrolment records inside the affected courses. These records may still point to the deleted source course.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So when Moodle opens:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Participants \u2192 Enrolment methods\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">it tries to load the old linked source course.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But that source course no longer exists.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So Moodle throws:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Can't find data record in database.\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This is not usually a permission issue. It is normally a broken reference issue.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Most Likely Cause<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">The most likely cause is an orphaned <strong>Course meta link<\/strong> record in the Moodle <code>enrol<\/code> table.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In Moodle, enrolment methods are stored in the enrolment table. For Course meta link enrolment, Moodle stores the linked source course ID in the <code>customint1<\/code> field.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So if the old source course was deleted, you may have a record like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>enrol = meta\ncustomint1 = deleted source course ID\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">That means Moodle still thinks the course is linked to another course, but the linked course no longer exists.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Before You Start<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Do not directly delete database records without a backup.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This fix touches enrolment records, so you should first:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Take a full database backup.<\/li>\n\n\n\n<li>Identify the broken records.<\/li>\n\n\n\n<li>Remove them using Moodle\u2019s enrolment API.<\/li>\n\n\n\n<li>Clear cache.<\/li>\n\n\n\n<li>Run cron.<\/li>\n\n\n\n<li>Recheck the affected courses.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Step 1: Identify Broken Course Meta Links<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Log in to your Moodle database and run the following SQL query.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Replace <code>mdl_<\/code> with your actual Moodle table prefix if your Moodle installation uses a different prefix.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT \n    e.id AS enrol_instance_id,\n    e.courseid AS target_course_id,\n    target.shortname AS target_shortname,\n    target.fullname AS target_course_name,\n    e.customint1 AS missing_source_course_id\nFROM mdl_enrol e\nJOIN mdl_course target ON target.id = e.courseid\nLEFT JOIN mdl_course source ON source.id = e.customint1\nWHERE e.enrol = 'meta'\nAND source.id IS NULL;\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This query checks all Course meta link enrolment methods and finds records where the source course no longer exists.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If the query returns rows, those are broken meta enrolment records.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>enrol_instance_id | target_course_id | target_shortname | target_course_name | missing_source_course_id\n101               | 25               | linux-basic       | Linux Basic Course | 7\n102               | 26               | devops-basic      | DevOps Basic Course | 7\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Meaning:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>target_course_id = course where the enrolment method page may be breaking\nmissing_source_course_id = deleted old course that was previously linked\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">In this example, course ID <code>7<\/code> was deleted, but courses <code>25<\/code> and <code>26<\/code> still have meta enrolment records pointing to it.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Step 2: Take a Database Backup<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Before making any change, take a Moodle database backup.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For MySQL or MariaDB:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mysqldump -u DBUSER -p DBNAME &gt; moodle_before_fix_broken_meta_links.sql\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mysqldump -u moodleuser -p moodledb &gt; moodle_before_fix_broken_meta_links.sql\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For large production Moodle sites, also confirm that you have a proper server backup or snapshot.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Do not skip this step. Enrolment records affect user access to courses.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Step 3: Create a Moodle CLI Script to Remove Broken Meta Links<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">The safest way is to remove the broken enrolment instances using Moodle\u2019s API.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Do not simply run a <code>DELETE FROM mdl_enrol<\/code> query unless you fully understand all related records. Moodle enrolment methods may have associated user enrolments, roles, events, and plugin-level cleanup logic.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Go to your Moodle root directory and create a new CLI script:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>nano admin\/cli\/fix_broken_meta_links.php\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Paste the following code:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\ndefine('CLI_SCRIPT', true);\n\nrequire(__DIR__ . '\/..\/..\/config.php');\nrequire_once($CFG-&gt;libdir . '\/clilib.php');\nrequire_once($CFG-&gt;libdir . '\/enrollib.php');\n\nglobal $DB;\n\n$plugin = enrol_get_plugin('meta');\n\nif (!$plugin) {\n    cli_error('Course meta link enrolment plugin not found.');\n}\n\n$sql = \"\n    SELECT e.*\n      FROM {enrol} e\n LEFT JOIN {course} source ON source.id = e.customint1\n     WHERE e.enrol = :enrol\n       AND source.id IS NULL\n\";\n\n$instances = $DB-&gt;get_records_sql($sql, &#91;'enrol' =&gt; 'meta']);\n\nif (!$instances) {\n    mtrace('No broken course meta link enrolment instances found.');\n    exit(0);\n}\n\nmtrace('Found ' . count($instances) . ' broken course meta link instance(s).');\n\nforeach ($instances as $instance) {\n    mtrace(\n        'Deleting broken meta enrol instance ID ' . $instance-&gt;id .\n        ' from target course ID ' . $instance-&gt;courseid .\n        ', missing source course ID ' . $instance-&gt;customint1\n    );\n\n    $plugin-&gt;delete_instance($instance);\n}\n\nmtrace('Done.');\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Save and exit.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This script does the following:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Finds all Course meta link enrolment instances\nChecks whether the linked source course exists\nFinds records where the source course is missing\nDeletes the broken enrolment instance using Moodle's enrolment API\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Step 4: Run the Script<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">From your Moodle root directory, run:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>php admin\/cli\/fix_broken_meta_links.php\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Found 3 broken course meta link instance(s).\nDeleting broken meta enrol instance ID 101 from target course ID 25, missing source course ID 7\nDeleting broken meta enrol instance ID 102 from target course ID 26, missing source course ID 7\nDeleting broken meta enrol instance ID 103 from target course ID 27, missing source course ID 7\nDone.\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If there are no broken records, you may see:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>No broken course meta link enrolment instances found.\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">In that case, the issue may be related to another broken enrolment method, missing context record, deleted role, or third-party enrolment plugin.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Step 5: Purge Moodle Cache<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">After deleting broken enrolment instances, purge Moodle cache.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>php admin\/cli\/purge_caches.php\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This ensures Moodle does not continue using old cached enrolment or course data.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Step 6: Run Moodle Cron<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Now run Moodle cron:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>php admin\/cli\/cron.php\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You can run it more than once:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>php admin\/cli\/cron.php\nphp admin\/cli\/cron.php\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Cron helps Moodle process pending cleanup tasks, enrolment syncs, deleted contexts, and scheduled maintenance operations.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Step 7: Run Context Cleanup If Needed<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">If the error still appears and the debug message mentions <code>context<\/code>, run Moodle\u2019s context cleanup task.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>php admin\/tool\/task\/cli\/schedule_task.php --execute='\\core\\task\\context_cleanup_task' --showdebugging\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This helps clean up broken or orphaned context records caused by deleted courses, categories, users, or enrolment structures.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Step 8: Recheck the Course<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Now open the affected course again:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Course \u2192 Participants \u2192 Enrolment methods\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The page should now load normally.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If the old Course meta link was the cause, the broken enrolment method should be gone.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Now you can add the correct enrolment method:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Add method \u2192 Cohort sync\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Select your cohort and assign the correct role, usually:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Student\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Step 9: Move from Course Meta Link to Cohort Sync<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">If your goal is to give one group of users access to many courses, Cohort sync is usually the cleaner approach.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Old approach:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Users enrolled in Master Course\n        \u2193\nCourse meta link\n        \u2193\nUsers get access to other courses\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Better approach:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Users added to Cohort\n        \u2193\nCohort sync\n        \u2193\nUsers get access to required courses\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This is easier to manage because cohorts are designed for grouping users at the site or category level.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Step 10: Bulk Add Cohort Sync to Many Courses<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">If you have hundreds of courses, adding Cohort sync manually one by one is painful.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Instead, use Moodle\u2019s <strong>Upload courses<\/strong> feature.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Go to:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Site administration \u2192 Courses \u2192 Upload courses\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Prepare a CSV file like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>shortname,enrolment_1,enrolment_1_cohortidnumber,enrolment_1_role\nCOURSE001,cohort,premium_students,student\nCOURSE002,cohort,premium_students,student\nCOURSE003,cohort,premium_students,student\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Where:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>shortname = existing Moodle course shortname\nenrolment_1 = cohort\nenrolment_1_cohortidnumber = Cohort ID\nenrolment_1_role = role to assign, usually student\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Important: <code>enrolment_1_cohortidnumber<\/code> should match the <strong>Cohort ID<\/strong>, not just the cohort display name.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then upload the CSV with:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Upload mode: Update existing courses only\nUpdate mode: Update with CSV data\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Always preview before applying changes.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Useful SQL Queries for Troubleshooting<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Check enrolment methods for one course<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Replace <code>123<\/code> with your course ID.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT \n    e.id,\n    e.enrol,\n    e.status,\n    e.courseid,\n    e.roleid,\n    e.customint1,\n    e.customint2,\n    e.customchar1\nFROM mdl_enrol e\nWHERE e.courseid = 123\nORDER BY e.sortorder, e.id;\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Find broken meta enrolments<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT \n    e.id,\n    e.courseid,\n    target.shortname AS target_course,\n    e.customint1 AS missing_source_course_id\nFROM mdl_enrol e\nJOIN mdl_course target ON target.id = e.courseid\nLEFT JOIN mdl_course source ON source.id = e.customint1\nWHERE e.enrol = 'meta'\nAND source.id IS NULL;\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Find enrolment records pointing to missing courses<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT e.*\nFROM mdl_enrol e\nLEFT JOIN mdl_course c ON c.id = e.courseid\nWHERE c.id IS NULL;\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Find user enrolments pointing to missing enrolment instances<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT ue.*\nFROM mdl_user_enrolments ue\nLEFT JOIN mdl_enrol e ON e.id = ue.enrolid\nWHERE e.id IS NULL;\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Find cohort sync records pointing to missing cohorts<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT e.*\nFROM mdl_enrol e\nLEFT JOIN mdl_cohort ch ON ch.id = e.customint1\nWHERE e.enrol = 'cohort'\nAND e.customint1 IS NOT NULL\nAND ch.id IS NULL;\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Best Practices to Avoid This Issue in Future<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">1. Do not use courses as enrolment containers unless necessary<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If your goal is to manage groups of users, use cohorts.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Better:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Cohort \u2192 Courses\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Avoid unnecessary dependency like:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Master Course \u2192 Other Courses\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">2. Before deleting courses, check meta links<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before deleting any old master\/source course, check whether other courses are using it as a Course meta link source.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can run:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT \n    e.id,\n    e.courseid AS target_course_id,\n    target.shortname AS target_course,\n    e.customint1 AS source_course_id,\n    source.shortname AS source_course\nFROM mdl_enrol e\nJOIN mdl_course target ON target.id = e.courseid\nJOIN mdl_course source ON source.id = e.customint1\nWHERE e.enrol = 'meta';\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This shows which courses depend on which source courses.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. Use Cohort sync for large-scale access<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For large Moodle installations with many courses, Cohort sync is easier to maintain.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SEO Students Cohort \u2192 50 SEO Courses\nDevOps Students Cohort \u2192 80 DevOps Courses\nSRE Students Cohort \u2192 40 SRE Courses\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">4. Keep regular database backups<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before deleting courses, categories, cohorts, or enrolment methods, always keep a backup.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">5. Run cron regularly<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Moodle cron should run every minute or as recommended for your Moodle version and server environment.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example crontab:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>* * * * * \/usr\/bin\/php \/path\/to\/moodle\/admin\/cli\/cron.php &gt;\/dev\/null\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Final Summary<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">If Moodle shows this error:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Can't find data record in database.\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">when opening:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Course \u2192 Participants \u2192 Enrolment methods\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">and you recently deleted old linked courses, the most likely cause is a broken <strong>Course meta link<\/strong> enrolment record.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The deleted course was probably still referenced by another course through a meta enrolment method.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The safest fix is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>1. Find broken meta enrolment records\n2. Backup the database\n3. Remove broken records using Moodle API\n4. Purge caches\n5. Run cron\n6. Recheck enrolment methods page\n7. Move to Cohort sync for future course access\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The important lesson is this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Course meta link depends on another course.\nCohort sync depends on a cohort.\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If you delete the source course used by Course meta link, Moodle may break when trying to load the enrolment method. But if you use Cohort sync properly, user access is cleaner, easier to manage, and much better for hundreds of courses.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">References<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Moodle Docs: Course meta link enrolment<br><a href=\"https:\/\/docs.moodle.org\/en\/Course_meta_link_enrolment\">https:\/\/docs.moodle.org\/en\/Course_meta_link_enrolment<\/a><\/li>\n\n\n\n<li>Moodle Developer Resources: Enrolment plugins<br><a href=\"https:\/\/moodledev.io\/docs\/4.5\/apis\/plugintypes\/enrol\">https:\/\/moodledev.io\/docs\/4.5\/apis\/plugintypes\/enrol<\/a><\/li>\n\n\n\n<li>Moodle GitHub: Course meta link enrolment code<br><a href=\"https:\/\/github.com\/moodle\/moodle\/blob\/MOODLE_405_STABLE\/enrol\/meta\/lib.php\">https:\/\/github.com\/moodle\/moodle\/blob\/MOODLE_405_STABLE\/enrol\/meta\/lib.php<\/a><\/li>\n\n\n\n<li>Moodle Docs: Course enrolment<br><a href=\"https:\/\/docs.moodle.org\/en\/Course_enrolment\">https:\/\/docs.moodle.org\/en\/Course_enrolment<\/a><\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Managing enrolments in Moodle is usually simple when everything is cleanly configured. But sometimes, after deleting old courses or changing the enrolment structure, Moodle may suddenly start&#8230; <\/p>\n","protected":false},"author":13,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-5640","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.cmsgalaxy.com\/blog\/wp-json\/wp\/v2\/posts\/5640","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.cmsgalaxy.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.cmsgalaxy.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.cmsgalaxy.com\/blog\/wp-json\/wp\/v2\/users\/13"}],"replies":[{"embeddable":true,"href":"https:\/\/www.cmsgalaxy.com\/blog\/wp-json\/wp\/v2\/comments?post=5640"}],"version-history":[{"count":1,"href":"https:\/\/www.cmsgalaxy.com\/blog\/wp-json\/wp\/v2\/posts\/5640\/revisions"}],"predecessor-version":[{"id":5641,"href":"https:\/\/www.cmsgalaxy.com\/blog\/wp-json\/wp\/v2\/posts\/5640\/revisions\/5641"}],"wp:attachment":[{"href":"https:\/\/www.cmsgalaxy.com\/blog\/wp-json\/wp\/v2\/media?parent=5640"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.cmsgalaxy.com\/blog\/wp-json\/wp\/v2\/categories?post=5640"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.cmsgalaxy.com\/blog\/wp-json\/wp\/v2\/tags?post=5640"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}