segunda-feira, 12 de agosto de 2013

Excluir alunos do curso do Moodle com comando SQL

Neste post, vamos mostrar como  excluir aluno do ambiente de curso no Moodle  usando comando SQL.  Vamos usar o comando DELETE. Isso é perigoso, uma vez exclui os dados. 
   
    Vamos mostrar como excluir os dados em em lote, ou seja, todos os alunos de um determinado curso. Também vamos mostrar como excluir apenas alguns alunos.

    O registro da  matrícula fica na tabela  mdl_role_assignments. O contexto da matrícula fica na tabela   mdl_context. Sendo assim, o comando da exclusão deve ser:

SQL  para excluir todos os alunos de um curso
DELETE FROM mdl_role_assignments WHERE roleid=5 AND contextid IN (SELECT id FROM mdl_context WHERE contextlevel=50 AND instanceid=?)

SQL  para excluir alguns alunos de um curso
DELETE FROM mdl_role_assignments WHERE roleid=5 AND contextid IN (SELECT id FROM mdl_context WHERE contextlevel=50 AND instanceid=?)  AND userid IN(?,?,?)

A única diferença do comando anterior é userid IN(?,?,?) que delimita quais alunos devem ser excluídos




Parâmetros
Descrição
roleid=5
Define filtro de exclusão apenas para alunos. Veja na tabela mdl_role valor de parâmetro para outros perfis. Por padrão, 5 é o aluno. Confirme se de fato você está usando 5 para alunos e não alterou o padrão. Já que está excluindo, todo o cuidado é pouco.
contextlevel=50
Especifica que se trata do contexto do curso. Na tabela de domínio, 50 se refere ao contexto do curso. Dê uma olhada nesse link:http://docs.moodle.org/dev/Roles_and_modules#Context
instanceid=?
Aqui passa o id do curso, o qual pretende excluir os alunos. Esse valor fica na tabela mdl_course.
userid IN(?,?,?)
Especifique quais alunos devem ser excluídos. O id dos alunos deve ser extraído da tabela mdl_user


Caso estiver usando a versão 2.x do Moodle, é necessário também apagar os dados da tabela mdl_user_enrolments. Esta tabela foi criada na versão 2 do Moodle. Contêm informações método de inscrição e data de inscrição. O campo enrolid faz ligação com a tabela mdl_enrol. É a chave estrangeira do campo id da tabela  mdl_enrol que faz registros dos plugins de inscrição habilitados no curso.

Sql para excluir informações de dados da inscrição de todos os alunos de um curso (apenas para versão 2.x)
 DELETE FROM mdl_user_enrolments WHERE enrolid IN (SELECT id FROM mdl_enrol WHERE  courseid=?)

Sql para excluir informações de dados da inscrição de alguns os alunos de um curso (apenas para versão 2.x)
DELETE FROM mdl_user_enrolments WHERE enrolid IN (SELECT id FROM mdl_enrol WHERE  courseid=?) AND userid IN(?,?,?)

A única diferença do comando anterior é userid IN(?,?,?) que delimita quais alunos devem ser excluídos

Nestes dois últimos comando, ficou claro que deve passar o id do curso no parâmetro  courseid=?. O valor desse parâmetro deve ser extraído da tabela mdl_course. Para o parâmetro userid IN(?,?,?) vale a mesma explicação apontada na tabela acima. 
   
    Os comandos listados aqui apenas retira o aluno do curso. Cancela a inscrição. Não excluir o histórico  do aluno. Caso o aluno venha a ser reinscrito, ele continuará o curso do ponto onde havia parado, ou seja, reaproveita todo o histórico.

    Bem, isso é tudo que você precisa saber para excluir alunos de um curso. Agora tome cuidado para não fazer nada errado. Teste primeiro no seu Moodle de desenvolvimento antes de levar para produção. Sempre recomendo ter um clone de produção no ambiente de desenvolvimento. Isso evita prejuízo e falha humanas. Lembre, estamos usando comando DELETE. Você não quer que a equipe pedagógica fique no seu cangote reclamando que o aluno simplesmente sumiu!

12 comentários:

  1. Em relação ao código:

    DELETE FROM mdl_user_enrolments WHERE enrolid IN (SELECT id FROM mdl_enrol WHERE courseid=?)

    ele irá apagar as informações de todos os usuário e não somente dos alunos. Como faço pra apagar somente os alunos, uso a verão 2.4.6

    ResponderExcluir
    Respostas
    1. Consegui executando o seguinte código:

      DELETE FROM mdl_user_enrolments WHERE enrolid IN (SELECT id FROM mdl_enrol WHERE courseid=?) AND userid IN (SELECT userid FROM mdl_role_assigments WHERE roleid=5);

      Quero saber se é necessário executar esse código e esse abaixo também?

      DELETE FROM mdl_role_assignments WHERE roleid=5 AND contextid IN (SELECT id FROM mdl_context WHERE contextlevel=50 AND instanceid=?)

      Excluir
    2. Neuton,
      É necessário sim. O processo de matrícula na versão 2.x do Moodle é alimentada em duas tabelas: mdl_user_enrolments e mdl_role_assignments. Para completar o processo é necessário também excluir a da tabela mdl_role_assignments.

      Excluir
    3. Neuton,
      Para apagar apenas os usuários com perfil aluno, execute os comandos que passe o parâmetros roleid=5. Os comandos que você está executando no segundo comentário apagam apenas os do perfil aluno.

      Excluir
    4. Fiz os testes e na versão 2.x do Moodle

      Devo executar primeiro o código da tabela 'mdl_user_enrolments', ele irá apagar os alunos do curso, mas ainda ficara o registro na tabela 'mdl_role_assignments':

      DELETE FROM mdl_user_enrolments WHERE enrolid IN (SELECT id FROM mdl_enrol WHERE courseid=?) AND userid IN (SELECT userid FROM mdl_role_assigments WHERE roleid=5);

      e depois devo apagar os registro da tabela 'mdl_role_assignments':

      DELETE FROM mdl_role_assignments WHERE roleid=5 AND contextid IN (SELECT id FROM mdl_context WHERE contextlevel=50 AND instanceid=?)

      Se for feito o inverso os alunos perderão apenas o perfil de estudante mas continuaram no curso, quando tentarmos excluir os dados da tabela 'mdl_user_enrolments' alguns alunos não serão desinscritos.

      Excluir
    5. Neuton,
      A execução desses dois comandos vai cancelar o registro de inscrição no curso. O usuário perderá o vínculo com o curso. O vínculo no curso requer um determinada perfil que pode ser aluno, tutor etc.
      O cancelamento da inscrição não cancela o histórico das atividades realizadas no curso. Caso for reescrito, o usuário pode continuar o curso de onde havia parado.

      Excluir
  2. Bom dia Lino,
    Exclui um aluno por engano, ele possuía notas e tarefas enviadas nas disciplinas. É possível voltar a referencia deste aluno a essas atividades e participações? Abraços

    ResponderExcluir
  3. Moodle IFTM, basta reinscrever o usuário no curso que automaticamente ele retoma suas notas nas atividades

    ResponderExcluir
  4. Respostas
    1. Ao excluir registro de aluno, para recupera-lo, basta reescrevê-lo novamente como você já registrou. A chave da matrícula é a combinação do id do usuário e id do contexto do curso. O id sequencial gerado na tabela de matrícula não tem validade nenhum para a lógica do sistema a não ser indexação de dados. Sendo assim, remover um registro de matrícula não compromete estrutura de dados, ou seja, histórico do aluno no curso.

      Para entender essa lógica, dê uma olhada nesse post: http://moodlephp.blogspot.com.br/2012/07/arquitetura-do-sistema-moodle.html

      Excluir
  5. Tem como excluir todos os alunos com um só comando para vários cursos pelo id, exemplo tenho 3 curso geografia, historia e letras com alunos diferente em cada curso, queria limpar todos os alunos de todos os curso com um só comando no caso ia só acrescentando o id de cada curso

    ResponderExcluir