Запись не может быть прочитана; нет разрешения на чтение для MSysObjects - PullRequest
7 голосов
/ 21 декабря 2009

Я пытаюсь получить список всех таблиц из базы данных формата Access 2007 ACCDB, используя Excel VBA.

Я подписался на этот пост:

Как получить имена таблиц из базы данных MS Access?

Использование:

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 ]

9 голосов
/ 03 февраля 2013

Поскольку ваша база данных имеет формат ACCDB, вы будете работать как пользователь Admin . Вы можете подтвердить эту точку в окне «Немедленно». (Перейдите туда с помощью Ctrl + g )

? CurrentUser()
Admin

Поскольку Администратор не имеет разрешения на чтение (SELECT) для MSysObjects, выполните оператор DDL, чтобы дать Администратор это разрешение.

strDdl = "GRANT SELECT ON MSysObjects TO Admin;"
CurrentProject.Connection.Execute strDdl
3 голосов
/ 22 декабря 2009

Использование коллекции таблиц DAO

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
1 голос
/ 01 октября 2012

Вот что сработало для меня, так как это первый SO вопрос, который возникает для этого:

  1. это файл MDB. Не знаю о других. Я понимаю, что вопрос не в этом. Тем не менее, вопросы и ответы StackOverflow также используются многими другими людьми, которые приходят сюда через Google, как и я, и я использую MDB. Я надеюсь, что этот ответ пригодится кому-то еще.

  2. Открыть графический интерфейс MS Access. Не понял, как это сделать без этого, извините, хотя, скорее всего, это возможно.

  3. Перейти в Инструменты ... Параметры ...

  4. Перейдите на вкладку «Просмотр»

  5. выберите «Скрытые объекты», «Системные объекты»

  6. закрыть вкладку

  7. Перейдите в Инструменты ... Безопасность .. Полномочия пользователя и группы

  8. Выберите все имена таблиц, включая MSysObjects

  9. установите все флажки «разрешения», чтобы они устанавливались как «отмеченные» для всех записей

  10. применить / OK при необходимости

1 голос
/ 21 декабря 2009

Похоже, проблема с разрешениями. Попробуйте открыть базу данных и перейти к разрешениям безопасности (в разделе Сервис-> Безопасность -> Права пользователей и групп) Убедитесь, что у вас есть доступ администратора к базе данных.

Если вы этого не сделаете, возможно, вам придется войти в базу данных как пользователь, который делает это и предоставляет вам разрешения

0 голосов
/ 22 декабря 2009

Мне удалось заставить код работать с файлом 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.

...