针对 CVE-2019-1402 在 MS Access 中引入的「查询已损坏](https://support.office.com/en-us/article/access-error-query-is-corrupt-fad205a5-9fd4-49f1-be83-f21636caedec)」错误的最新解决方法。
还有其他一些解决方法需要在管理级别应用,例如卸载错误的更新。与此相比,这里提供的解决方法的意图是通过自动更改 MDB/ACCDB 内容本身来工作,且工作量尽可能小。
微软确实在 2019-12-10(补丁日)发布了此问题的修复程序,该修复程序将默认通过 WSUS 等自动安装。
因此,应用修复程序后,此解决方法应已过时,任何使用过它的人都可以调用 RemoveWorkaroundForCorruptedQueryIssue() 函数来恢复原始应用程序状态。
确保在「VBA 编辑器 -> 工具 -> 引用」下启用了 Microsoft DAO 3.6 Object Library(向后兼容)或 Microsoft Office x.x Access Database Engine Object Library 引用(请参阅 #1 了解详情)。
使用 basWorkaround.bas 模块自动实现微软建议的解决方法(使用查询代替表)。作为预防措施,请先备份您的数据库。
调用 AddWorkaroundForCorruptedQueryIssue() 以应用解决方法,并随时调用 RemoveWorkaroundForCorruptedQueryIssue() 以移除它。
AddWorkaroundForCorruptedQueryIssue() 会给所有非系统表添加 _Table 后缀,例如表 IceCreams 将被重命名为 IceCreams_Table。
它还会创建一个与原表同名的新查询,该查询将选择重命名表的所有列。在我们的示例中,查询将命名为 IceCreams,并执行 SQL select * from [IceCreams_Table]。
RemoveWorkaroundForCorruptedQueryIssue() 会执行相反的操作。
我在包含 400 多个各种类型表的大型项目中使用此解决方法,包括外部非 MDB 表(如 SQL Server)。
在我的情况下,我需要手动将 USysRibbons_Table 重命名回 USysRibbons,因为我之前创建它时没有将其标记为系统表。
请记住以下几点:
TableDefs!MyTableName 之类的语句将需要您在代码/UI 中搜索并替换这些实例)。