From 832acc2639ccec847e9ce8efb33ee093444f9b2e Mon Sep 17 00:00:00 2001 From: Muhammad Arnaldo Date: Wed, 10 Dec 2025 14:53:28 +0700 Subject: [PATCH] MDL-86420 enrol_database: avoid duplicate key violations --- public/enrol/database/db/upgrade.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/enrol/database/db/upgrade.php b/public/enrol/database/db/upgrade.php index e6af6646b6b..755d5bd7f53 100644 --- a/public/enrol/database/db/upgrade.php +++ b/public/enrol/database/db/upgrade.php @@ -58,15 +58,19 @@ function xmldb_enrol_database_upgrade($oldversion) { // Migrate enrolments where possible. // First, get the user enrolments that can be migrated. + // Only select the earliest (MIN id) user_enrolments per user to avoid + // duplicate key violations when a user has multiple enrolments across + // duplicate database enrol instances. $migrateusers = $DB->get_records_sql( - "SELECT ue.id + "SELECT MIN(ue.id) AS id FROM {user_enrolments} ue WHERE ue.enrolid $insql AND NOT EXISTS ( SELECT 1 FROM {user_enrolments} ue2 WHERE ue2.userid = ue.userid - AND ue2.enrolid = :idtokeep)", + AND ue2.enrolid = :idtokeep) + GROUP BY ue.userid", array_merge($inparams, ['idtokeep' => $idtokeep]), );