domingo, 17 de outubro de 2010

Apagar Nota, Atividades e Log do Aluno no Curso do Moodle com Comando SQL

Ao cancelar a inscrição de um aluno no curso no ambiente Moodle, os registros de na base de dados (atividades realizadas, nota e log) vinculado à matricula   não serão excluídos automaticamente, ou seja, em efeito cascata.  Uma das alternativas para remover os registros órfãos é executar o comando SQL diretamente na base de dados.
  
Para excluir os dados órfãos de uma matricula  no curso  é necessário dois parâmetros:

  • id do curso – Chave de identificação do curso na tabela mdl_course
  • id do usuário - Chave de identificação do curso na tabela mdl_user
Há uma postagem no blogue que explique isso. Clique aqui para ler.


Tendo os parâmetros da chave do curso e do usuário, só resta   apagar os registro com comando DELETE passando os parâmetros da chave do usuário e curso.
Passe o parâmetro da chave do curso em course=?   ou courseid =? e do usuário em userid=?


Apagar Log

DELETE FROM mdl_log WHERE course=? AND userid=?
   
Apagar Notas
DELETE FROM mdl_grade_grades WHERE  userid=? and itemid IN  (SELECT id FROM mdl_grade_items WHERE courseid=?)

    A sub consulta apaga apenas as notas de um determinado curso.
A tabela mdl_grade_grades é o repositório final de notas.


Apagar Atividades

Apagar nota do fórum
DELETE FROM mdl_forum_ratings WHERE post IN (SELECT p.id FROM mdl_forum_posts p INNER JOIN mdl_forum_discussions d ON p.discussion=p.id  WHERE p.userid=? AND d.course=?)

Apagar os comentários

DELETE FROM mdl_forum_posts WHERE userid=?  AND  discussion IN (SELECT id FROM mdl_forum_discussions WHERE course=?)

Não é recomendável apagar os comentários já que os comentários aninhados ficarão órfãos, ou seja, as respostas das respostas.

Apagar tópicos
DELETE  FROM mdl_forum_discussions WHERE userid=? AND course=?

Não é recomendável apagar os tópicos já que os comentários aninhados ficarão órfãos.

Apagar Tarefas

DELETE FROM mdl_assignment_submissions WHERE userid =? AND assignment IN (SELECT id FROM mdl_assignment WHERE course =?)

Ao remover as tarefas, as notas serão removidas automaticamente.


Apagar questionário

Apagar nota final
DELETE FROM mdl_quiz_grades WHERE userid =?  AND quiz IN (SELECT id FROM mdl_quiz WHERE course =?)

Apagar Tentativas de Respostas
DELETE FROM mdl_question_states WHERE  attempt IN (SELECT t.id FROM mdl_quiz_attempts t INNER JOIN  mdl_quiz q  ON t.quiz=q.id WHERE t.userid= ? AND course =?)

Apagar cada tentativa (inclusive a nota final)
DELETE FROM mdl_quiz_attempts WHERE userid =?  AND quiz IN (SELECT id FROM mdl_quiz WHERE course =?)

Para fazer limpeza total, os dados do aluno devem ser removida de todas de todas as atividades instanciadas no curso. Os comandos SQL acima demostrados se restringiram em remover as atividades do fórum, tarefa e questionário.  Para as demais atividades, siga a mesma lógica. Identifica as tabelas e apague os dados.
Feito isso, todo o histórico do aluno será removida da base de dados. Ao ser reinscrito no curso,  não terá nenhuma nota e nem log de acesso.

9 comentários:

  1. Amigo, Gostaria de adicionar as tabelas:
    mdl_cache_text
    mdl_grade_grades_history
    mdl_lesson_attempts
    mdl_question_attempts ¹
    mdl_question_sessions ²

    ¹ Observe que tem o quiz e não a questão em si.
    ² Sendo que a _questions_sessions não sei como apagaria.
    * Na verdade quando fui fazer a atualização do moodle decidi limpá-lo para o novo semestre. Foi aí que percebi estas tabelas lotadas. por isso não sei como seria o comando SQl correto para limpar o _question_sessions

    Vlw Lino mais uma vez salvando os moodlers!!!

    Abraços

    ResponderExcluir
    Respostas
    1. Clayton,
      Segue o comando para remover os dados da tabela. Para apagar os dados de uma determinada matrícula, basta passar o parâmetro id do usuário e id do curso.
      Segue o comando para cada item solicitado:


      mdl_question_sessions
      Comando SQL para apagar os registros de sessão do questionário de um aluno

      DELETE FROM mdl_question_sessions WHERE attemptid IN (SELECT a.id FROM mdl_quiz_attempts a INNER JOIN mdl_quiz q ON q.id=a.quiz WHERE a.userid=? AND q.course=?)


      mdl_quiz_attempts
      Comando SQL para apagar os registros das tentativas de preenchimento do questionário de um aluno

      DELETE FROM mdl_quiz_attempts WHERE userid=? AND quiz IN ( SELECT id FROM mdl_quiz WHERE course=?)


      mdl_lesson_attempts
      Comando SQL para apagar os registros da lição de um aluno

      DELETE FROM mdl_lesson_attempts WHERE userid=? AND lessonid IN ( SELECT id FROM mdl_lesson WHERE course=?)


      mdl_grade_grades_history
      Comando SQL para apagar os registros do histórico de nota de um aluno

      DELETE FROM mdl_grade_grades_history WHERE userid=? AND itemid IN ( SELECT id FROM mdl_grade_items WHERE courseid=?)


      mdl_cache_text
      Comando SQL para apagar todos os registros do cache. Ainda estou pesquisando a razão da existência desse cache no Moodle. Fiz um teste no Moodle limpando o cache. Depois acessei o Moodle e funcionou normalmente. Se você souber para que serve esse cache, compartilhe aqui.

      DELETE FROM mdl_cache_text

      Excluir
  2. Pessoal, eu queria saber como selecionar as notas de um aluno já cancelado do curso, ou seja, da tabela moodle_grades_grades_history

    ResponderExcluir
    Respostas
    1. Augusto,

      Para visualizar o histórico de nota de um determinado aluno no curso, execute o seguinte comando SQL:

      SELECT h.source,h.finalgrade FROM mdl_grade_grades_history h INNER JOIN mdl_grade_items i ON i.id=h.itemid WHERE i.courseid=? AND h.userid=?

      Passe os parâmetros id do curso em i.courseid=? e id do usuário em h.userid=?


      Esse comando recupera as informações mesmo que o aluno já tenha sido excluído do curso. Você pode também consultar as informações de nota do aluno sem ser pelo histórico, já que a exclusão da matrícula não exclui os dados do aluno no curso.

      Excluir
  3. Estou com problemas em excluir arquivos no Moodle 2.4 onde o mesmo não deixa nenhum aluno ou mesmo o administrador excluir arquivos. Como posso solucionar este problema?

    ResponderExcluir
  4. Este comentário foi removido pelo autor.

    ResponderExcluir
  5. ola boa tarde, gostei muito desse tutorial, queria saber como faço para apagar todos de uma só vez, alunos, notas, log, tarefas, nota final ou seja quero zera minha base de dados com os alunos antigos e todos os trabalho que tiver relacionado a eles como fazer isso no comando sql, pois esse tutorial mostra como fazer aluno por aluno, e na verdade queria fazer saber o comando para excluir todos de uma só vez, todos os alunos, notas, tarefas etc. agradeço desde de já.

    ResponderExcluir
  6. como faço para deletar as tarefas de todos os usuário de um curso

    ResponderExcluir