diff --git a/lib/db/install.xml b/lib/db/install.xml index 51e9ac16601..aecf51e66eb 100644 --- a/lib/db/install.xml +++ b/lib/db/install.xml @@ -2230,6 +2230,7 @@ + @@ -3863,4 +3864,4 @@
- \ No newline at end of file + diff --git a/lib/db/upgrade.php b/lib/db/upgrade.php index 4fa1f58ec07..0d34d582aa8 100644 --- a/lib/db/upgrade.php +++ b/lib/db/upgrade.php @@ -2373,5 +2373,32 @@ function xmldb_main_upgrade($oldversion) { upgrade_main_savepoint(true, 2018051704.03); } + if ($oldversion < 2018051704.04) { + // Remove duplicate entries from group memberships. + // Find records with multiple userid/groupid combinations and find the highest ID. + // Later we will remove all those entries. + $sql = " + SELECT MIN(id) as minid, userid, groupid + FROM {groups_members} + GROUP BY userid, groupid + HAVING COUNT(id) > 1"; + if ($duplicatedrows = $DB->get_recordset_sql($sql)) { + foreach ($duplicatedrows as $row) { + $DB->delete_records_select('groups_members', + 'userid = :userid AND groupid = :groupid AND id <> :minid', (array)$row); + } + } + $duplicatedrows->close(); + + // Define key useridgroupid (unique) to be added to group_members. + $table = new xmldb_table('groups_members'); + $key = new xmldb_key('useridgroupid', XMLDB_KEY_UNIQUE, array('userid', 'groupid')); + // Launch add key useridgroupid. + $dbman->add_key($table, $key); + + // Main savepoint reached. + upgrade_main_savepoint(true, 2018051704.04); + } + return true; } diff --git a/version.php b/version.php index 89c8802a5d7..ff4313d7530 100644 --- a/version.php +++ b/version.php @@ -29,7 +29,7 @@ defined('MOODLE_INTERNAL') || die(); -$version = 2018051704.03; // 20180517 = branching date YYYYMMDD - do not modify! +$version = 2018051704.04; // 20180517 = branching date YYYYMMDD - do not modify! // RR = release increments - 00 in DEV branches. // .XX = incremental changes.