
Последнее обходное решение для ошибки "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 (см. #1 для получения дополнительных сведений).
Используйте модуль 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 потребует от вас поиска и замены для этих экземпляров в вашем коде/интерфейсе).