
Последнее обходное решение для ошибки "Query is corrupt", введенной с CVE-2019-1402
Последний обходной путь для ошибки Запрос поврежден, введенной с CVE-2019-1402 в MS Access.
Существуют другие обходные пути, которые необходимо применять на административном уровне, например, путем удаления ошибочного обновления. В отличие от них, цель представленного здесь обходного пути — работать путем автоматического изменения содержимого MDB/ACCDB с минимальными усилиями.
Microsoft выпустила исправление для этой проблемы 10 декабря 2019 года (день патча), которое по умолчанию будет автоматически установлено через WSUS и т.д. Таким образом, этот обходной путь должен устареть после применения исправления, и любой, кто его использовал, может вызвать функцию RemoveWorkaroundForCorruptedQueryIssue() для восстановления исходного состояния приложения.
Убедитесь, что в Редактор VBA -> Сервис -> Ссылки включена ссылка на Microsoft DAO 3.6 Object Library (обратная совместимость) или Microsoft Office x.x Access Database Engine Object Library (см. для получения дополнительных сведений).
Используйте модуль basWorkaround.bas для автоматической реализации предложенного Microsoft обходного пути (использование запроса вместо таблицы). В качестве меры предосторожности сначала создайте резервную копию базы данных.
Вызовите AddWorkaroundForCorruptedQueryIssue() для применения обходного пути и RemoveWorkaroundForCorruptedQueryIssue() для его удаления в любое время.
AddWorkaroundForCorruptedQueryIssue() добавит суффикс _Table ко всем несистемным таблицам, например, таблица IceCreams будет переименована в IceCreams_Table.
Она также создаст новый запрос с исходным именем таблицы, который будет выбирать все столбцы переименованной таблицы. В нашем примере запрос будет называться IceCreams и будет выполнять SQL select * from [IceCreams_Table].
RemoveWorkaroundForCorruptedQueryIssue() выполняет обратные действия.
Я использую этот обходной путь в крупных проектах с 400+ таблицами всех видов, включая внешние не-MDB таблицы (например, SQL Server).
В моем случае мне пришлось вручную переименовать USysRibbons_Table обратно в USysRibbons, так как я не пометил её как системную таблицу при создании.
Учтите следующее:
TableDefs!MyTableName потребует от вас поиска и замены для этих экземпляров в вашем коде/интерфейсе).