
La dernière solution de contournement pour l'erreur « Query is corrupt » introduite avec CVE-2019-1402
Le dernier contournement pour l'erreur La requête est corrompue introduite avec CVE-2019-1402 dans MS Access.
Il existe d'autres contournements qui doivent être appliqués au niveau administratif, par exemple en désinstallant la mise à jour défectueuse. Contrairement à ceux-ci, celui fourni ici a pour but de fonctionner en modifiant automatiquement le contenu MDB/ACCDB lui-même, avec le moins d'effort possible.
Microsoft a publié un correctif pour ce problème le 10/12/2019 (jour des correctifs) qui sera, par défaut, installé automatiquement via WSUS, etc.
Ce contournement devrait donc devenir obsolète une fois le correctif appliqué, et toute personne qui l'a utilisé peut appeler la fonction RemoveWorkaroundForCorruptedQueryIssue() pour restaurer l'état d'origine de l'application.
Assurez-vous que la référence Microsoft DAO 3.6 Object Library (rétrocompatibilité) ou Microsoft Office x.x Access Database Engine Object Library soit activée dans Éditeur VBA -> Outils -> Références (voir pour plus de détails).
Utilisez le module basWorkaround.bas pour implémenter automatiquement le contournement suggéré par Microsoft (en utilisant une requête au lieu d'une table). Par précaution, sauvegardez d'abord votre base de données.
Appelez AddWorkaroundForCorruptedQueryIssue() pour appliquer le contournement et RemoveWorkaroundForCorruptedQueryIssue() pour le supprimer à tout moment.
AddWorkaroundForCorruptedQueryIssue() ajoutera le suffixe _Table à toutes les tables non-système, par ex. la table IceCreams serait renommée en IceCreams_Table.
Elle créera également une nouvelle requête portant le nom d'origine de la table, qui sélectionnera toutes les colonnes de la table renommée. Dans notre exemple, la requête serait nommée IceCreams et exécuterait le SQL select * from [IceCreams_Table].
RemoveWorkaroundForCorruptedQueryIssue() effectue les actions inverses.
J'utilise ce contournement sur de grands projets comptant plus de 400 tables de toutes sortes, y compris des tables externes non-MDB (comme SQL Server).
Dans mon cas, j'ai dû renommer manuellement USysRibbons_Table en USysRibbons, car je ne l'avais pas marquée comme table système lors de sa création.
Gardez les points suivants à l'esprit :
TableDefs!MyTableName vous obligera à effectuer un rechercher/remplacer pour ces occurrences dans votre code/interface).