MDL-86420 enrol_database: avoid duplicate key violations

This commit is contained in:
Muhammad Arnaldo
2025-12-11 10:25:31 +07:00
parent 48c9857449
commit 9ebe2f8676
+6 -2
View File
@@ -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]),
);