Unificar usuários duplicados no Moodle com comando SQL

Unificar usuários duplicados no Moodle com comando SQL

por Lino Vaz Moniz -
Número de respostas: 0

Caso um usuário tenha dois cadastro na base de dados que ocorreu por engano, para eliminar essa duplicação,  há alguns passos a serem seguidos.

Mapear lista de usuários duplicados

O primeiro passo é mapear a lista de usuários duplicados. Isso deve ser feita pesquisando na base pelos campos que os dois usuários tenham em comum.  Se o campo comum for e-mail, execute contagem usando GROUP BY campo e-mail.  Segue o comando SQL que faz isso.

 SELECT email,COUNT(email) as countrecord FROM mdl_user GROUP BY email HAVING COUNT(email) > 1

O comando acima retorna a lista de registro com duplicidade.  Agora, é necessário mapear cada id dos usuários duplicados. Para isso, execute uma consulta na base para retornar ID de cada registro da consulta anterior.  Para isso, execute o seguinte comando SQL:

SELECT id FROM mdl_user WHERE email=?

Essa consulta extrai a lista de ID de cada registro duplicado

 

Unificar os registros

Após mapear os registros duplicados, agora é necessário unificar. Caso o acesso ao curso tenha ocorrido só com um determinado ID, a solução é remover o id que  não ocorreu acesso. Mas se o acesso ocorreu com os dois ids, a  alternativa é fundir o id de um no outro.  Isso deve ser feita em todas as tabelas onde ocorreu registo.

Vamos demonstrar isso em algumas tabelas (user, log,  fórum e quadro de notas) e orientar como proceder para os demais.

Imagine que usuário X está duplicado é tem dois ids: 200 e 300. A solução é converter tudo que foi feito no id 200 para 300. Para isso, execute os seguintes comandos:

Tabela de usuário

UPDATE mdl_user SET id=300 WHERE id=200

Tabela de log a partir da versão 2.7

UPDATE mdl_logstore_standard_log SET userid=300 WHERE userid=200

Tabela de log  antes  da versão 2.7

UPDATE mdl_log SET userid=300 WHERE userid=200

Participação no fórum

UPDATE mdl_forum_posts SET userid=300 WHERE userid=200;
UPDATE mdl_forum_discussions SET userid=300 WHERE userid=200;

 

Tabela geral de notas

UPDATE mdl_grade_grades SET userid=300 WHERE userid=200

 

Os demais dados devem ser mapeados através das tarefas instanciadas no curso. Por exemplo, se o curso usa fórum, basta mapear todas as tabelas com prefixo fórum mdl_forum_*.  Siga esse padrão e mapeie todas as tabelas seguindo padrão de nome das tarefas usados nos cursos. Padrão de tabelas: md_<nomedopligun>_*

Há um post que traz uma metodologia similar, que explica como apagar dados dos usuários. Sugiro leitura desse post que pode ajudar a mapear mais tabelas. Segue o post:

Apagar Nota, Atividades e Log do Aluno no Curso do Moodle com Comando SQL
http://moodlesql.blogspot.com.br/2010/10/apagar-nota-atividades-e-log-do-aluno.html