Impossible de supprimer des utilsiateurs

Impossible de supprimer des utilsiateurs

par melab86 Brouard,
Nombre de réponses : 14

Bonjour à tous,

J'ai un peu plus de 10 000 comptes à supprimer (utilisateurs ne s'étant pas connectés depuis plus de 3 ans). Mon souci repose sur le fait que je ne peux utiliser la suppression en lot car j'ai de nombreux utilisateurs que je ne peux supprimer (même de manière individuel, ces utilisateurs ne sont inscrits dans aucun cours). Le message d'erreur obtenu est le suivant:" Identifiant de module de cours non valide"


Merci beaucoup de votre aide!

Mélanie

Moyenne des évaluations  -
En réponse à melab86 Brouard

Re: Impossible de supprimer des utilsiateurs

par Christian Bocquet,
Avatar Moodleurs particulièrement utiles

Bonjour,

Si j'ai bien compris, vous voulez supprimer de votre plate-forme des utilisateurs.
A partir de la même page "Actions en lots pour les utilisateurs", plutôt que de "Supprimer" les utilisateurs filtrés et sélectionnés, vous pouvez essayer de "Télécharger" le fichier CSV. A partir de ce fichier, vous ne conservez que le champ username et vous ajoutez le champ deleted :

username,deleted
christian,1
melanie,1

Sur la page "Importation des utilisateurs", vous déposez le nouveau fichier en suivant la documentation : Supprimer des comptes

En espérant qu'en procédant ainsi, on court-circuite le message d'erreur.

Christian


Moyenne des évaluations Utile (1)
En réponse à Christian Bocquet

Re: Impossible de supprimer des utilsiateurs

par melab86 Brouard,

Merci Christian pour ce retour.Je testerai à l'occasion.

J'ai le sentiment qu'une suppression n'entraine pas systématiquement la suppression totale dans les bases de Moodle.

En réponse à melab86 Brouard

Re: Impossible de supprimer des utilsiateurs

par Christian Bocquet,
Avatar Moodleurs particulièrement utiles

Oui, dans la table mdl_user, il reste la ligne, mais modifiée, correspondant à l'identifiant id de l'utilisateur supprimé .

Et par exemple, si un utilisateur a écrit un message dans un forum du cours et que le cours n'est pas réinitialisé, ce message apparaîtra toujours mais sous le nom "Utilisateur supprimé" (en anglais : "Deleted user").

Christian

En réponse à Christian Bocquet

Re: Impossible de supprimer des utilsiateurs

par Jean-Gabriel DEPINOY,
Avatar Moodleurs particulièrement utiles
Bonjour Mélanie,
Même si tes utilisateurs sont maintenant supprimés, tu peux nettoyer ta base de données en t'appuyant sur les requêtes proposées par Moodle.
Il est préférable de faire une sauvegarde de la BDD au préalable.
Ensuite, tu utilises PhpMyAdmin pour exécuter chaque requête.
La première requête que te propose Moodle deviendra SELECT * FROM mdl_tool_dataprivacy_request LEFT JOIN mdl_user on mdl_tool_dataprivacy_request.dpo=mdl_user.id WHERE mdl_tool_dataprivacy_request.dpo IS NOT NULL AND mdl_user.id IS NULL
Il suffit de supprimer les { } et de faire précéder le nom des tables par mdl_. Tu remplaces ensuite t1 par le nom de la table 1 et t2 par le nom de la table 2.
La requête liste les enregistrements que tu peux supprimer.
Pour supprimer ces enregistrements, tu remplaces SELECT par DELETE et * par le nom de ta première table et le tour est joué.
Pour la première requête, ça donne: DELETE mdl_tool_dataprivacy_request FROM mdl_tool_dataprivacy_request LEFT JOIN mdl_user on mdl_tool_dataprivacy_request.dpo=mdl_user.id WHERE mdl_tool_dataprivacy_request.dpo IS NOT NULL AND mdl_user.id IS NULL
Ainsi, tous les enregistrements orphelins de ta base qui ne peuvent plus servir (parce que les liens entre les tables sont rompus) seront supprimés de ta bese de données.
Moyenne des évaluations Utile (1)
En réponse à melab86 Brouard

Re: Impossible de supprimer des utilsiateurs

par Patrick Lemaire,
Avatar Développeurs de plugins Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

Bonjour Mélanie,

Au delà des suggestions de Christian, je pense qu'il serait bon pour la santé de ta plateforme de te soucier de ce problème même si cette gène n'existe, pour le moment, que pour la suppression des utilisateurs.

Je te recommande d'activer temporairement le « Mode débogage » (dans Administration du site > Développement > Débogage, il faut passer la valeur de « Messages de débogage » sur « Développeur : afficher tous les messages de débogage de Moodle », puis cocher la case « Afficher les informations de débogage »). De cette façon, tu devrais obtenir davantage d'information sur cette erreur. Nous pourrions avoir des pistes sur son origine.

Communique nous les éventuelles nouvelles informations ici, et désactive le « Mode débogage ».

À bientôt,
Patrick

En réponse à Patrick Lemaire

Re: Impossible de supprimer des utilsiateurs

par Jean-Gabriel DEPINOY,
Avatar Moodleurs particulièrement utiles
Bonjour Mélanie,
Vu ton message d'erreur, je pense qu'il y a un autre problème. Il semblerait que certains éléments invalides soient restés dans ta base de données. En plus des conseils donnés par Christian et Patrick, je te conseillerais d'aller dans Administration du site > Développement > Editeur XMLDB > et de cliquer sur le lien hypertexte Vérifier les clés étrangères. Tu devrais voir apparaître ce que Moodle appelle des violations de clés étrangères. Peux-tu nous donner une capture d'écran de cette page ?
En réponse à Jean-Gabriel DEPINOY

Re: Impossible de supprimer des utilsiateurs

par Patrick Lemaire,
Avatar Développeurs de plugins Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs
Bonjour Jean-Gabriel,
Je profite que tu abordes ce point pour te demander des précisions utiles sur le diagnostic et les possibles remédiations via cet outil.
As-tu des informations sur les résultats et leur interprétation ? En effet, des violations (de Clefs étrangères !!!), j'en ai un paquet sans trop mesurer l'impact et les remèdes possibles.

À bientôt,
Patrick
En réponse à Patrick Lemaire

Re: Impossible de supprimer des utilsiateurs

par Jean-Gabriel DEPINOY,
Avatar Moodleurs particulièrement utiles
Sauf erreur de ma part, cette fonction balaye la BDD et repère tous les enregistrements des différentes tables pour lesquels les liens ont été perdus avec les autres tables. Ces enregistrements ne sont donc plus utiles.
Lorsque Moodle supprime certaines données, il semblerait que certaines données restent dans la BDD. Cette fonction repère ces enregistrements orphelins et propose une requête pour les identifier.
Depuis de nombreuses années que j'exécute ces requêtes et que je supprime les enregistrements orphelins identifiés par ces requêtes, je n'ai jamais eu aucun problème dans le fonctionnement de ma plateforme Moodle.
En réponse à Jean-Gabriel DEPINOY

Re: Impossible de supprimer des utilsiateurs

par melab86 Brouard,
Bonjour,
Voilà ce que j'obtiens (voir pièces jointes)... comment puis-je procéder pour la suite?
Merci infiniment.
Annexe cleetrangere.jpg
Annexe violation2.jpg
Annexe violationhistory.jpg
En réponse à Patrick Lemaire

Re: Impossible de supprimer des utilsiateurs

par melab86 Brouard,
Bonjour,

Merci pour ce retour. Je n'avais pas penser au mode débogage...
L'origine est un cours en autoinscription avec plus de 5000 utilisateurs...en réinitialisant le cours j'ai pu supprimer les utilsiteurs qui ne s'étaient pas connectés depuis plus de 3 ans..
A bientôt
Mélanie
En réponse à melab86 Brouard

Re: Impossible de supprimer des utilsiateurs

par Bruno Malaval,
Avatar Moodleurs particulièrement utiles

Bonjour,

J'arrive à comprendre le principe de ces violations, sans savoir pourquoi elles se produisent.
Certainement lorsque des erreurs sont provoquées .. ?
Exemple : je vois bien cela se produire lors d'une erreur lors de la restauration d'un cours, mais pas seulement.

Un exemple concret sur ma plateforme de test :
Au niveau de la protection des données, une demande de suppression de données est générée à la suppression (=désactivation) de chaque compte utilisateur

J'ai la violation suivante :

La clef étrangère dpo sur la table tool_dataprivacy_request subit 5 violations sur un total de 31 rangées.
SELECT * FROM {tool_dataprivacy_request} t1 LEFT JOIN {user} t2 ON t1.dpo = t2.id WHERE t1.dpo IS NOT NULL AND t2.id IS NULL;
Dans le fichier admin/tool/dataprivacy/classes/db/dbinstall.xml , il est défini pour la table tool_dataprivacy_request :

      <KEYS>
        <KEY NAME="primary" TYPE="primary" FIELDS="id"/>
        <KEY NAME="userid" TYPE="foreign" FIELDS="userid" REFTABLE="user" REFFIELDS="id"/>
        <KEY NAME="requestedby" TYPE="foreign" FIELDS="requestedby" REFTABLE="user" REFFIELDS="id"/>
        <KEY NAME="dpo" TYPE="foreign" FIELDS="dpo" REFTABLE="user" REFFIELDS="id"/>
        <KEY NAME="usermodified" TYPE="foreign" FIELDS="usermodified" REFTABLE="user" REFFIELDS="id"/>
      </KEYS>

Le champ "mdl_tool_dataprivacy_request.dpo" est lié au champ "mdl_user.id" par une clé étrangère.

Problème dans ma table mdl_tool_dataprivacy_request : j'ai 5 enregistrements pour lesquels le champ
dpo = 0 (pourquoi ? bah je sais pas ......)
et évidemment pas d'utilisateur avec un id = 0

Maintenant, si je valide la demande de suppression de données, le script s'exécute bien et en refaisant le test j'ai maintenant :

La clef étrangère dpo sur la table tool_dataprivacy_request subit 4 violations sur un total de 30 rangées.
SELECT * FROM {tool_dataprivacy_request} t1 LEFT JOIN {user} t2 ON t1.dpo = t2.id WHERE t1.dpo IS NOT NULL AND t2.id IS NULL;
Je suis passé de 5 à 4 violations.
La demande de suppression a bien été traitée, l'enregistrement a été supprimé de la table et j'ai une violation de moins.

Donc certaines opérations de nettoyage comme la suppression de données, la réinitialisation de cours, .. peuvent déjà permettre de nettoyer un peu la base.

Après, pour obtenir 0 violations, je flaire un travail titanesque d'analyse des données ... 😱

J'ai également pas mal de violations concernant les annotations pdf.
Là, je suppose que le problème vient de la conservation des fichiers convertis, alors que le devoir n'est plus actif ou le cours réinitialisé.
Il y a un ticket dans le tracker à ce sujet [MDL-69570]
Je n'ai pas fouillé plus dans les tables à ce sujet, mais je suppose que les violations à ce niveau proviennent de fichiers convertis, qui ne sont plus associés à un devoir existant.

voilà pour ma petite contribution ... à suivre

Bruno

En réponse à Bruno Malaval

Re: Impossible de supprimer des utilsiateurs

par Jean-Gabriel DEPINOY,
Avatar Moodleurs particulièrement utiles
Bonjour Bruno,
Pourquoi dis-tu que le boulot est titanesque pour supprimer toutes les violations ?
A partir du moment où Moodle identifie qu'il n'est plus en mesure d'utiliser certains enregistrements parce qu'il y a une perte de liens entre les tables, il ne pourra de toutes manières plus rien faire de ces enregistrements.
On peut donc les supprimer avec des requêtes SQL.
La fonction Editeur XMLDB > Violation de clefs étrangères ne propose généralement que quelques requêtes pour trouver tous les enregistrements "orphelins".
En ne lançant que ces quelques requêtes, on peut trouver parfois plusieurs milliers ou dizaines de milliers d'enregistrements à supprimer.
Il y sûrement de nombreuses raisons pour expliquer ces violations (suppression de données (cours, groupes, devoirs, tests, ...)).
En réponse à Jean-Gabriel DEPINOY

Re: Impossible de supprimer des utilsiateurs

par Bruno Malaval,
Avatar Moodleurs particulièrement utiles
Bonjour Jean-Gabriel,

Je suis d'accord avec toi, il est facile de supprimer ces enregistrements.
Mais, si je suis toujours partant pour attaquer la base de données par des requêtes, j'aime bien savoir exactement les conséquences.

Question que je me pose :
Les clés étrangères sont bien renseignées dans les fichiers dbinstall.xml.
Mais est-ce-que tous les liens entre tables sont bien renseignés ?
Est-ce-qu'il ne pourrait pas y avoir des requêtes avec des jointures non déclarées ?
Ce qui pourrait aboutir à des erreurs du type "xxxx.id invalid" ?

C'est peut-être un excès de prudence ...

Autre problème concernant justement l'exemple que j'ai donné :
Il s'agit de la suppression de données pour un compte supprimé.
Pour un compte supprimé, dont l'id du dpo n'était pas bon, j'ai quand même pu valider la demande automatique de suppression de données.
Une fois la demande traitée, l'enregistrement est supprimé de la table tool_dataprivacy_request, et les données nettoyées (j'ai vérifié dans les logs du cron).
Si je supprime l'enregistrement dans la table, je ne peux plus valider la suppression de données.

Comme je le disais dans le précédent post, je n'ai pas fouillé plus cette partie.
Je me pose juste quelques questions avant de me lancer dans un nettoyage de ces éléments.

Un point que j'essaierai bien est déjà d'utiliser les scripts de correction proposés dans cette page
Les points 15 et 16 permettent de corriger certaines erreurs.
Et voir ensuite si cela corrige certaines erreurs sur les clés étrangères

Bruno
Bruno