XMLDB : Vérifier les violations de clefs extérieures

XMLDB : Vérifier les violations de clefs extérieures

par Séverin Terrier,
Nombre de réponses : 10
Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

Bonjour,

Peut-être avez-vous, sur vos Moodle 2.x récents, essayé de vérifier différents éléments depuis XMLDB (Administration du site > Développement > Éditeur XMLDB).

Personnellement, quand je lance "Vérifier les clefs extérieures", j'obtiens plusieurs erreurs de "Clefs extérieures subissant des violations".

Suis-je le seul ? Si non, avez-vous fait quelque chose par rapport à cela ?

Séverin

Moyenne des évaluations  -
En réponse à Séverin Terrier

Re: XMLDB : Vérifier les violations de clefs extérieures

par Luiggi Sansonetti,
Avatar Développeurs de plugins Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Titulaires du Moodle Course Creator Certificate Avatar Traducteurs

bonjour

j'ai fait sous un Moodle 2.5.1 et un Moodle 2.5, et j'ai des résultats totalement différents :

2.5.1 --> 15 clefs d'erreur
2.5 --> 2 clés d'erreur

et pas du tout sur les mêmes éléments, peut être dû aux versions mais allez donc savoir à quoi ça sert... (en tout cas je ne sais pas...)

En réponse à Luiggi Sansonetti

Re: XMLDB : Vérifier les violations de clefs extérieures

par Pascal Maury,
Avatar Développeurs de plugins

Pour info, sur ma 2.7.4+ : Clefs extérieures subissant des violations: 18

Et le détails pour voir si on a les mêmes :

Clefs extérieures trouvées subissant des violations

  • La clef extérieure courseid sur la table scale_history subit 1 violations sur un total de 5 rangées

  • La clef extérieure question sur la table question_answers subit 10 violations sur un total de 125318 rangées.

  • La clef extérieure parent sur la table grade_categories_history subit 7 violations sur un total de 14012 rangées.

  • La clef extérieure courseid sur la table grade_items_history subit 3970 violations sur un total de 70537 rangées.

  • La clef extérieure categoryid sur la table grade_items_history subit 5382 violations sur un total de 70537 rangées.

  • La clef extérieure loggeduser sur la table grade_items_history subit 1 violations sur un total de 70537 rangées.

  • La clef extérieure rawscaleid sur la table grade_grades_history subit 186 violations sur un total de 1481443 rangées.

  • La clef extérieure userid sur la table files subit 138 violations sur un total de 448469 rangées.

  • La clef extérieure user sur la table assign_user_mapping subit 897 violations sur un total de 104053 rangées.

  • La clef extérieure userid sur la table assign_user_flags subit 2 violations sur un total de 24846 rangées.

  • La clef extérieure optionid sur la table choice_answers subit 1 violations sur un total de 477 rangées.

  • La clef extérieure frompageidfk sur la table wiki_links subit 11 violations sur un total de 1790 rangées.

  • La clef extérieure question sur la table question_calculated subit 10 violations sur un total de 77 rangées.

  • La clef extérieure question sur la table question_calculated_options subit 5 violations sur un total de 49 rangées.

  • La clef extérieure category sur la table question_dataset_definitions subit 1 violations sur un total de 112 rangées.

  • La clef extérieure question sur la table question_datasets subit 5 violations sur un total de 113 rangées.

  • La clef extérieure question sur la table question_numerical_options subit 7 violations sur un total de 364 rangées.

  • La clef extérieure question sur la table question_numerical_units subit 8 violations sur un total de 81 rangées.

En réponse à Pascal Maury

Re: XMLDB : Vérifier les violations de clefs extérieures

par Séverin Terrier,
Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

Alors, pour comparaison, voila les chiffres sur mes différentes plateformes, toutes en Moodle 2.7.4.

Principale :

Clefs extérieures subissant des violations: 11

  • La clef extérieure courseid sur la table scale_history subit 4 violations sur un total de 13 rangées.
  • La clef extérieure rawscaleid sur la table grade_grades subit 3208 violations sur un total de 33838 rangées.
  • La clef extérieure courseid sur la table grade_items_history subit 1192 violations sur un total de 13001 rangées.
  • La clef extérieure categoryid sur la table grade_items_history subit 1054 violations sur un total de 13001 rangées.
  • La clef extérieure scaleid sur la table grade_items_history subit 12 violations sur un total de 13001 rangées.
  • La clef extérieure rawscaleid sur la table grade_grades_history subit 11925 violations sur un total de 274886 rangées.
  • La clef extérieure loggeduser sur la table grade_grades_history subit 9508 violations sur un total de 274886 rangées.
  • La clef extérieure user sur la table assign_user_mapping subit 249 violations sur un total de 52792 rangées.
  • La clef extérieure pageid sur la table lesson_branch subit 138 violations sur un total de 1576 rangées.
  • La clef extérieure cm sur la table plagiarism_compilatio_files subit 308 violations sur un total de 2705 rangées.
  • La clef extérieure cm sur la table plagiarism_compilatio_config subit 1757 violations sur un total de 5761 rangées.


FOAD :

Clefs extérieures subissant des violations: 15

  • La clef extérieure question sur la table question_answers subit 387 violations sur un total de 10517 rangées.
  • La clef extérieure scaleid sur la table grade_items subit 1 violations sur un total de 4078 rangées.
  • La clef extérieure rawscaleid sur la table grade_grades subit 2861 violations sur un total de 36541 rangées.
  • La clef extérieure courseid sur la table grade_items_history subit 469 violations sur un total de 26328 rangées.
  • La clef extérieure categoryid sur la table grade_items_history subit 259 violations sur un total de 26328 rangées.
  • La clef extérieure scaleid sur la table grade_items_history subit 13 violations sur un total de 26328 rangées.
  • La clef extérieure rawscaleid sur la table grade_grades_history subit 3973 violations sur un total de 80199 rangées.
  • La clef extérieure loggeduser sur la table grade_grades_history subit 6 violations sur un total de 80199 rangées.
  • La clef extérieure user sur la table assign_user_mapping subit 296 violations sur un total de 15115 rangées.
  • La clef extérieure userid sur la table assign_user_flags subit 3 violations sur un total de 21900 rangées.
  • La clef extérieure uniqueid sur la table quiz_attempts subit 1 violations sur un total de 2281 rangées.
  • La clef extérieure cm sur la table plagiarism_compilatio_files subit 1 violations sur un total de 717 rangées.
  • La clef extérieure cm sur la table plagiarism_compilatio_config subit 987 violations sur un total de 5936 rangées.
  • La clef extérieure questionid sur la table qtype_multichoice_options subit 69 violations sur un total de 2610 rangées.
  • La clef extérieure question sur la table question_truefalse subit 81 violations sur un total de 604 rangées.


Formation continue :

Clefs extérieures subissant des violations: 9

  • La clef extérieure rawscaleid sur la table grade_grades subit 2 violations sur un total de 2359 rangées.
  • La clef extérieure courseid sur la table grade_items_history subit 127 violations sur un total de 2353 rangées.
  • La clef extérieure categoryid sur la table grade_items_history subit 96 violations sur un total de 2353 rangées.
  • La clef extérieure rawscaleid sur la table grade_grades_history subit 8 violations sur un total de 6703 rangées.
  • La clef extérieure loggeduser sur la table grade_grades_history subit 185 violations sur un total de 6703 rangées.
  • La clef extérieure user sur la table assign_user_mapping subit 28 violations sur un total de 698 rangées.
  • La clef extérieure entryid sur la table glossary_entries_categories subit 2 violations sur un total de 13 rangées.
  • La clef extérieure cm sur la table plagiarism_compilatio_files subit 7 violations sur un total de 21 rangées.
  • La clef extérieure cm sur la table plagiarism_compilatio_config subit 147 violations sur un total de 726 rangées.


Séverin

En réponse à Séverin Terrier

Re: XMLDB : Vérifier les violations de clefs extérieures

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

Puisqu'on en est à porter plainte... Voici mes déclarations de viols pour ma 2.5.9 adorée cœur :

Clefs extérieures subissant des violations: 34
Clefs extérieures trouvées subissant des violations
    La clef extérieure sourcecmid sur la table course_modules_availability subit 2 violations sur un total de 129 rangées.
    La clef extérieure courseid sur la table scale_history subit 2 violations sur un total de 2 rangées.
    La clef extérieure parent sur la table question_categories subit 8 violations sur un total de 9470 rangées.
    La clef extérieure category sur la table question subit 6 violations sur un total de 43785 rangées.
    La clef extérieure question sur la table question_answers subit 240 violations sur un total de 99727 rangées.
    La clef extérieure rawscaleid sur la table grade_grades subit 811 violations sur un total de 84255 rangées.
    La clef extérieure parent sur la table grade_categories_history subit 1 violations sur un total de 9577 rangées.
    La clef extérieure courseid sur la table grade_items_history subit 12807 violations sur un total de 70555 rangées.
    La clef extérieure categoryid sur la table grade_items_history subit 31115 violations sur un total de 70555 rangées.
    La clef extérieure scaleid sur la table grade_items_history subit 3 violations sur un total de 70555 rangées.
    La clef extérieure rawscaleid sur la table grade_grades_history subit 1206 violations sur un total de 312334 rangées.
    La clef extérieure loggeduser sur la table grade_grades_history subit 9420 violations sur un total de 312334 rangées.
    La clef extérieure assignment sur la table assign_user_mapping subit 13268 violations sur un total de 98844 rangées.
    La clef extérieure assignment sur la table assign_user_flags subit 2942 violations sur un total de 11804 rangées.
    La clef extérieure optionid sur la table choice_answers subit 8 violations sur un total de 8929 rangées.
    La clef extérieure discussionid sur la table forum_queue subit 2 violations sur un total de 39 rangées.
    La clef extérieure postid sur la table forum_queue subit 2 violations sur un total de 39 rangées.
    La clef extérieure userid sur la table quiz_overrides subit 18 violations sur un total de 343 rangées.
    La clef extérieure scoid sur la table scorm_scoes_track subit 1 violations sur un total de 10723 rangées.
    La clef extérieure scorm_objective_scoid sur la table scorm_seq_objective subit 1 violations sur un total de 1 rangées.
    La clef extérieure frompageidfk sur la table wiki_links subit 1 violations sur un total de 637 rangées.
    La clef extérieure cm sur la table plagiarism_compilatio_files subit 333 violations sur un total de 1992 rangées.
    La clef extérieure cm sur la table plagiarism_compilatio_config subit 2023 violations sur un total de 10094 rangées.
    La clef extérieure question sur la table question_calculated subit 4 violations sur un total de 198 rangées.
    La clef extérieure category sur la table question_dataset_definitions subit 1 violations sur un total de 409 rangées.
    La clef extérieure question sur la table question_datasets subit 3 violations sur un total de 418 rangées.
    La clef extérieure questionid sur la table qtype_match_options subit 4 violations sur un total de 1521 rangées.
    La clef extérieure questionid sur la table qtype_match_subquestions subit 17 violations sur un total de 9967 rangées.
    La clef extérieure question sur la table question_multianswer subit 38 violations sur un total de 1719 rangées.
    La clef extérieure question sur la table question_multichoice subit 33 violations sur un total de 20706 rangées.
    La clef extérieure question sur la table question_numerical_options subit 181 violations sur un total de 511 rangées.
    La clef extérieure question sur la table question_numerical_units subit 3 violations sur un total de 93 rangées.
    La clef extérieure questionid sur la table qtype_shortanswer_options subit 5 violations sur un total de 3125 rangées.
    La clef extérieure question sur la table question_truefalse subit 9 violations sur un total de 2360 rangées.

J'ai des difficultés à trouver un trait commun mais sans doute parce que ces violations n'ont pas les mêmes origines. Dans mon cas, de nombreux cours ont été déployés par sauvegarde / restauration depuis ma 1.9.19 !

La proportion de cours doit impacter. La mienne possède 3232 espaces de cours dont 811 sont actuellement masqués.

A suivre...
Patrick

En réponse à Patrick Lemaire

Re: XMLDB : Vérifier les violations de clefs extérieures

par Séverin Terrier,
Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

Je ne suis pas certain qu'un grand nombre de cours implique en lui même un grand nombre de clés "violées". Je pense que c'est plutôt lié à l'ancienneté, au types d'activités différentes utilisées...

Pour ma part, sur mes différentes plateformes :

  • principale - nombre de cours : 2296 (dont 378 actuellement fermés)
  • formation continue - nombre de cours : 155 (dont 37 actuellement fermés)
  • FOAD - nombre de cours : 1172 (dont 830 actuellement fermés)

Séverin

En réponse à Séverin Terrier

Re: XMLDB : Vérifier les violations de clefs extérieures

par Anne Garnavault Remy,

Bonjour,

Clefs extérieures subissant des violations: 35 !

Comme vous je pense que c'est du à un Moodle ( chez nous 2.6.6) sur lequel ont été importé beaucoup de cours de 1.9 ( quand cela a été fait on était en 2.3 ou 2.4) avec des plantages dus a des temps d'exécution trop long. Je me souviens avoir d'ailleurs augmenté les temps d'exécution à cause de cela. Et avoir eu ensuite des cron bloqués par exemple pour des références non trouvées dans les tables.

Avec cela on fait quoi? Comment gérer ces erreurs pour avoir une base "propre" ? Comment repérer les effets de bord?

Je n'ai pas de réponse et je suis bien dubitative à moins de gérer au cas par cas... 

Si vous avez des solutions ou des expériences à ce sujet  , je suis preneuse.

Anne

En réponse à Anne Garnavault Remy

Re: XMLDB : Vérifier les violations de clefs extérieures

par Pascal Maury,
Avatar Développeurs de plugins

Moi je suis pas trop inquiet et je ne compte pas trop passer du temps la-dessus tant qu'on ne m'a pas prouvé que cela a un véritable effet néfaste.

Autant les autres vérifs ( [Vérifier les index] [Vérifier les valeurs par défaut] [Vérifier les entiers]) me semblent pertinentes et faciles à réparer, autant celle-ci est plus floue à mon gout et surtout chronophage.

Certes il est vrai que je ne me suis pas penché dessus. J'ai juste essayé d'exécuter qq requêtes mais pour les résoudre, il faut se pencher sur chaque cas je pense.

Comme dit mon boss : "le mieux est l'ennemi du bien" ! Au pire, il y a des entrées en base qui font référence à des éléments supprimés, pour le moment je n'ai pas constaté que cela soit la source de problèmes.
Ceci dit, c'est sur que si on me donne une solution clé en main, je prends !

NB : à quoi sert "[Mots réservés]" ?

Moyenne des évaluations Utile (1)
En réponse à Pascal Maury

Re: XMLDB : Vérifier les violations de clefs extérieures

par Séverin Terrier,
Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

Effectivement, cette partie n'est pas la plus simple à corriger, et ne semble (a priori) pas poser de problème dans Moodle, en tout cas actuellement.

Concernant les [Mots réservés], ce sont ceux des différents logiciels de base de données, qu'il ne faut absolument pas utiliser comme nom de table ou de colonne ! Ceci est indiqué dans la documentation de développement.

On pourra également trouver plus de renseignements concernant les structures de la base de données de Moodle.

Pour en revenir aux violations de clefs extérieures, cela risque d'être gênant le jour ou Moodle décidera d'adopter des règles d'intégrité référentielle. Il en était question dès 2005, une autre discussion datant de 2008 en parle (et annonce justement cet outil dans XMLDB), et il existe dans le traqueur MDL-30799.

Malgré tout, on peut supposer (et espérer) qu'avant de mettre cela en place, des outils de vérification et correction des problèmes relevés seront mis en place...

Notons également cette discussion qui, dès 2004, parlait du passage à InnoDB, abordant également les notions d'intégrité et les transactions.

Moyenne des évaluations Utile (1)
En réponse à Séverin Terrier

Re: XMLDB : Vérifier les violations de clefs extérieures

par Jean-Gabriel DEPINOY,
Avatar Moodleurs particulièrement utiles

Bonsoir à toutes et à tous,

J'ai rencontré le même problème avec plus de 200 violations. Il semblerait qu'il s'agisse de suppressions de lignes qui se soit fait dans certaines tables mais pas dans d'autres liées à celles-ci. J'ai résolu le problème en remplaçant les valeurs qui posaient problème par la valeur NULL. Ainsi, je n'ai plus aucun message de violation et ma plateforme semble toujours fonctionner parfaitement.

En fait, dans PhpMyAdmin, je me suis appuyé sur la syntaxe de requête proposée par l'Editeur XMLDB pour exécuter les requêtes permettant de remplacer en une seule fois la clé qui posait problème par NULL dans l'ensemble de la table.

Pour ceux qui ne connaissent absolument pas l'écriture en requêtes SQL, remplacez "SELECT * FROM" par "UPDATE", puis les noms des tables (qui apparaissent entre accolades) par le même nom sans accolades et précédé de "mdl_" (si, comme moi, dans votre base de données toutes les tables commencent par "mdl_"). 

Ensuite remplacez "t1." par le nom de la première table et "t2." par le nom de la deuxième table. Supprimez les "t1" et "t2" restants. Juste avant le "WHERE", saisissez "SET " suivi du nom de la colonne qui pose problème dans la première table et de "= NULL". Le reste ne change pas. 

Exemple:

SELECT * FROM {question} t1 LEFT JOIN {user} t2 ON t1.modifiedby = t2.id WHERE t1.modifiedby IS NOT NULL AND t2.id IS NULL

devient:

UPDATE mdl_question LEFT JOIN mdl_user ON mdl_question.modifiedby = mdl_user.id SET modifiedby=NULL WHERE mdl_question.modifiedby IS NOT NULL AND mdl_user.id IS NULL

Par contre, j'ai toujours des problèmes de sauvegardes automatiques qui bloquent en plein milieu. J'espérai que ces corrections résoudraient le problème, mais ça n'a rien changé pour moi. J'ai des fichiers de sauvegarde automatique de moins en moins volumineux (environ 10 Mo il y a 2 mois alors que ma dernière sauvegarde ne fait pas 1 Mo). Je suis passé en 2.8.3, j'ai mis à jour mes tables comme expliqué ci-dessus, mais toujours pas moyen de faire une sauvegarde complète du site. J'ai toujours une erreur sur un cours (pas toujours le même) malgré l'augmentation des temps dans le fichier php.ini. Si quelqu'un a résolu ce problème, je suis preneur. Mais je vais évoquer la question dans un autre sujet de forum parce qu'il me semble que le sujet a déjà été évoqué.

En réponse à Jean-Gabriel DEPINOY

Re: XMLDB : Vérifier les violations de clefs extérieures

par Séverin Terrier,
Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

Bonjour,

Ta solution pour te débarrasser des alertes de clefs violées me parait un peu expéditive...

Effectivement, l'erreur ne s'affiche plus, mais est-ce que pour autant cela corrige le problème initial, je n'en suis pas (du tout) sur.

Séverin

PS : pour les sauvegardes automatiques, on continue d'en parler sur la discussion dédiée (je ne suis pas sur qu'il y ait un lien direct)