如何防止MS Access隐藏表在Excel Power Query中被查看?
Power Query会绕过Access UI层的隐藏设置与ACCDE的限制,直接从Jet/ACE引擎的元数据中读取表信息,因此普通的隐藏操作无法阻止它访问敏感表。以下是几种可行的解决办法:
全库密码加密
先在源ACCDB文件中设置数据库密码(「文件」→「信息」→「用密码进行加密」),再重新打包为ACCDE。Power Query连接时必须输入正确密码才能访问数据库内容,未授权用户无法读取任何表,包括敏感表。
注:分发时需告知用户密码,这是最直接有效的防护方式。拆分后端并设置用户级权限
将敏感表迁移至独立的后端数据库(ACCDB/ACCDE),前端仅保留查询、窗体等交互对象。在后端数据库中配置用户级安全(ULS),仅给用户分配必要对象的访问权限,禁止其读取敏感表及系统元数据。
注:用户级安全需在ACCDB环境下配置完成后再转ACCDE,确保权限规则生效。即使前端被Power Query连接,也无法直接访问后端的敏感表。临时应急:伪装成系统表
将敏感表重命名为MSys开头的名称(如MSysConfidentialData)并设置为隐藏。Power Query默认不显示系统表,普通用户极少会手动开启「包括系统表」选项,可临时降低暴露风险。
注:该方法仅作隐藏,无法真正阻止懂行的用户,不能替代加密或权限控制。VBA检测并阻止非授权连接
在前端的AutoExec宏或启动窗体的Load事件中添加VBA代码,检测连接来源是否为Power Query,若是则关闭数据库。示例代码如下:Private Sub Form_Load() Dim connString As String connString = CurrentProject.Connection.ConnectionString ' 通过连接字符串特征判断是否为Power Query连接 If InStr(LCase(connString), "powerquery") > 0 Then MsgBox "禁止未授权的数据库访问", vbCritical Application.Quit acQuitSaveNone End If End Sub注:该方法可能存在误判,需优化判断逻辑,且对熟悉VBA的用户有被绕过的可能,但能阻挡大部分普通用户的非授权访问。
内容的提问来源于stack exchange,提问作者Takazeki

