记录无法读取;没有“MSysObjects”的读取权限

时间:2009-12-21 01:06:04

标签: excel-vba ms-access ms-access-2007 vba excel

我正在尝试使用Excel VBA从Access 2007 ACCDB格式数据库中获取所有表的列表。

我关注过这篇文章:

How can I get table names from an MS Access Database?

使用:

SELECT MSysObjects.Name AS table_name
FROM MSysObjects
WHERE
        (((Left([Name],1))<>"~")
    AND ((Left([Name],4))<>"MSys")
    AND ((MSysObjects.Type) In (1,4,6)))
order by MSysObjects.Name

但是我收到了这个错误。

  

记录无法读取;没有'MSysObjects'的读取权限

我希望能够仅使用SQL语句而不是OpenSchema方法来获取表名。

我认为问题出在Access上。我不确定。

有人有任何想法吗?

5 个答案:

答案 0 :(得分:9)

由于您的数据库是ACCDB格式,因此您将以用户 Admin 的身份工作。您可以在立即窗口中确认该点。 (用 Ctrl + g 去那里)

? CurrentUser()
Admin

由于 Admin SELECT没有读取(MSysObjects)权限,因此请执行DDL语句以向 Admin 授予该权限。< / p>

strDdl = "GRANT SELECT ON MSysObjects TO Admin;"
CurrentProject.Connection.Execute strDdl

答案 1 :(得分:3)

使用DAO tabledefs集合

Sub TableDefs()

    Dim db As dao.Database
    Dim tdfLoop As dao.TableDef

    Set db = CurrentDb
    With db
        Debug.Print .TableDefs.Count & " TableDefs in " & .name
        For Each tdfLoop In .TableDefs
            Debug.Print "    " & tdfLoop.name
        Next tdfLoop
    End With

End Sub

答案 2 :(得分:1)

它看起来像权限问题。尝试打开数据库并转到安全权限(在工具 - >安全 - &gt;用户和组权限下)确保您拥有数据库的管理员权限。

如果不这样做,则可能必须以执行并授予自己权限的用户身份登录数据库

答案 3 :(得分:1)

这对我有用,因为这是第一个提出这个问题的问题:

  1. 这是一个MDB文件。不了解别人。 我知道这不是问题所要求的。但是,StackOverflow问题/答案也被许多其他通过谷歌到达这里的人使用,就像我一样,我正在使用MDB。我希望这个答案对其他人有用。

  2. 打开MS Access GUI。没有它,没有弄明白如何做到这一点,对不起,虽然这很有可能。

  3. 转到工具...选项...

  4. 点击“查看”标签

  5. 选择“隐藏对象”,“系统对象”

  6. 关闭标签

  7. 转到工具...安全性..用户和组权限

  8. 选择所有表名,包括MSysObjects

  9. 点击所有“权限”复选框,以便为所有条目设置为“已选中”

  10. 根据需要申请/确认

答案 4 :(得分:0)

我能够使代码与MDB文件一起使用。我可以使用功能区上的“数据库工具 - 用户和权限”来设置用户权限。此选项仅适用于MDB文件。现在的问题是让它与ACCDB文件一起使用。

这是我的代码:

Dim DBFile As String  
Dim Connection As ADODB.Connection 
Dim Recordset As New ADODB.Recordset

DBFile = "C:\Documents and Settings\User\Desktop\Son.mdb"

Set Connection = New ADODB.Connection  <br/>
Connection.Open "Provider=Microsoft.ACE.OLEDB.12.0; Data Source= " & DBFile & ";"  

SQLString = "SELECT MSysObjects.Name AS table_name" & _
"FROM MSysObjects WHERE (((Left([Name],1))<>" & """~""" & ")" & _
"AND ((Left([Name], 4))<>" & """MSys""" & ")" & _
"AND ((MSysObjects.Type) In (1,4,6)));order by MSysObjects.Name" 

Set Recordset = New ADODB.Recordset 
Recordset.Open SQLString, Connection

问题在于我无法使用ACCDB文件。