如何通过DBeaver查看MS Access数据库查询的SQL代码?
解决DBeaver批量提取Access查询SQL代码的问题
问题场景
- 用DBeaver Enterprise 24.0.0通过Modern JDBC-ODBC bridge连接Access 2007-2016格式数据库
- 需批量提取数百条查询的SQL代码,但DBeaver内查看视图定义/生成DDL时,始终返回
-- View definition not available; - 尝试查询系统表
MSysObjects时触发权限错误:SQL Error [42000]: [-1907][42000]: [Microsoft][ODBC Microsoft Access Driver] Record(s) cannot be read; no read permission on 'MSysObjects' - UCanAccess驱动连接失败,程序长时间无响应后崩溃
可行解决方案
方案1:授权后通过系统表批量查询
- 打开目标Access数据库,依次点击文件>选项>当前数据库
- 在「导航选项」里勾选「显示系统对象」,确定后刷新导航栏
- 右键
MSysObjects表,选择设计视图 - 点击设计选项卡>属性表,给当前用户添加读取数据权限,保存更改
- 返回DBeaver,执行以下SQL批量提取查询代码:
SELECT Name AS 查询名称, SQL AS 查询SQL代码 FROM MSysObjects WHERE Type = 5 AND Flags = 0;
说明:Type=5代表查询对象,Flags=0用于过滤系统内置查询,结果会返回所有自定义查询的名称和对应SQL
方案2:Access内用VBA批量导出SQL
不想修改系统表权限的话,直接在Access里用VBA脚本批量导出:
- 打开Access数据库,按
Alt+F11打开VBA编辑器 - 插入新模块,粘贴以下代码:
Sub 批量导出查询SQL() Dim qdf As QueryDef Dim fso As Object Dim 导出路径 As String ' 修改为你需要的导出目录 导出路径 = "C:\Access查询导出\" Set fso = CreateObject("Scripting.FileSystemObject") ' 自动创建目录 If Not fso.FolderExists(导出路径) Then fso.CreateFolder 导出路径 End If ' 遍历所有查询并导出 For Each qdf In CurrentDb.QueryDefs ' 跳过系统查询 If Left(qdf.Name, 4) <> "MSys" Then Dim 文件 As Object Set 文件 = fso.CreateTextFile(导出路径 & qdf.Name & ".sql", True) 文件.WriteLine qdf.SQL 文件.Close End If Next qdf MsgBox "所有查询SQL已导出至:" & 导出路径, vbInformation End Sub
- 运行该宏,所有查询的SQL会导出到指定目录的单个
.sql文件中
方案3:修复UCanAccess连接问题
如果坚持用UCanAccess驱动:
- 确保下载的UCanAccess驱动包(需包含
ucanaccess.jar、jackcess.jar等所有依赖文件)版本与DBeaver 24.0.0兼容 - 在DBeaver连接配置中,手动指定所有依赖Jar包的路径,不要仅选择
ucanaccess.jar - 降低DBeaver的连接超时阈值,避免因超时导致崩溃
- 若数据库文件较大,先执行文件>压缩和修复数据库后再尝试连接
内容的提问来源于stack exchange,提问作者Malikah
相关产品推荐
相关产品推荐

