11
votes

L'enregistrement ne peut pas être lu; Aucune autorisation de lecture sur 'MsysObjects'

J'essaie d'obtenir une liste de toutes tables à partir d'une base de données Format Accdb AccdB à l'aide d'Excel VBA.

J'ai suivi ce message:

Comment puis-je obtenir des noms de table d'une base de données MS Access?

Utilisation: xxx

mais je reçois cette erreur.

L'enregistrement ne peut pas être lu; Aucune autorisation de lecture sur 'MsysObjects'

Je veux pouvoir obtenir les noms de table uniquement à l'aide d'une instruction SQL et non de la méthode openschema .

Je pense que le problème est avec accès. Je ne suis pas sûr.

Quelqu'un a-t-il une idée?


9 commentaires

Quel est votre environnement de programmation? De quoi allez-vous utiliser les résultats pour?


En outre, quel est votre format de fichier - accdb ou mdb?


Merci pour votre question. J'utilise accdb.


En outre, j'utilise VBA pour transférer des informations de l'accès à Excel.


Votre VBA est-elle dans Excel ou dans l'accès?


Comment essayez-vous d'ouvrir un sur votre relevé SQL? ADO ou DAO? Code postal. Il peut y avoir quelque chose de mal là-bas, par exemple avec une chaîne de connexion.


J'utilise ADO. Mon code est l'une des réponses sur cette page qui commence par "J'ai pu faire le code ..."


Désolé - je m'aurais prévu de modifier votre question initiale plutôt que de poster des informations supplémentaires comme réponse. Quoi qu'il en soit, avez-vous essayé de changer votre chaîne de connexion pour correspondre à la première liste répertoriée à Connexionstrings.com/Access-2007 < / a>?


J'ai eu ma connexion de chaîne dans le même site web. J'ai inclus la partie Persist Security Info Info = False; Mais je reçois toujours la même erreur.


5 Réponses :


0
votes

Cela ressemble à un problème d'autorisations. Essayez d'ouvrir la base de données et d'aller aux autorisations de sécurité (sous Outils-> Security -> Autorisations de l'utilisateur et de groupe) Assurez-vous de disposer d'un accès administrateur à la base de données.

Si vous n'avez peut-être pas à vous connecter à la base de données en tant qu'utilisateur qui vous permet d'accéder à des autorisations


2 commentaires

-1 outils-> Security-> Les autorisations de l'utilisateur et du groupe n'existent pas dans Access 2007


@jaywon: Ce choix de menu existe si vous consultez un fichier MDB. Il ne se présentera pas si vous consultez un fichier ACCDB, pour lequel il n'existe aucun support pour la sécurité au niveau des utilisateurs de Jet. Donc, votre commentaire est faux.



3
votes

Utilisez la collection Dao Tablefs

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


4 commentaires

Cela semble judicieux, mais l'OP dit "Je veux pouvoir obtenir les noms de table uniquement à l'aide d'une instruction SQL"


Il n'y a rien dans la question initiale suggérant que cela se fait d'un accès extérieur, il me semble donc que si vous allez avoir une liste de tables, vous allez faire quelque chose avec eux. Court d'utilisation de la chaîne SQL en tant que RowSource d'une liste déroulante / liste, vous allez utiliser du code pour utiliser la liste résultante, auquel cas, il ne fait pratiquement aucune différence si vous utilisez la collection TableFS Walk à travers le jeu d'enregistrements basé sur le jeu la déclaration SQL.


Remou, bien sûr, il n'a pas dit d'utiliser une déclaration SQL. Je pense s'il n'a pas eu de réponse en maintenant, il devrait essayer des alternatives.


Expliquer pourquoi i suis ici: J'essaie d'énumérer les tables dans un fichier * .MDB à l'aide de Perl sur Cygwin; Essayer de le faire avec DBD :: ODBC échoue sur cette erreur et le module Win32 :: Ole pouvant être utilisé pour faire DAO ne sera pas installé.



0
votes

J'ai pu rendre le code fonctionner avec un fichier MDB. J'ai eu la possibilité de définir les autorisations de l'utilisateur à l'aide de «Outils de base de données - utilisateurs et autorisations» sur le ruban. Cette option est uniquement disponible pour les fichiers MDB. Maintenant, le problème est de le faire fonctionner avec un fichier ACCDB.

Voici mon code: xxx

Le problème est que je ne peux pas le faire fonctionner avec les fichiers ACCDB .


0 commentaires

2
votes

Voici ce qui a fonctionné pour moi, car c'est la première question qui se pose pour cela:

  1. Ceci est un fichier MDB. Je ne sais pas sur les autres. Je comprends que ce n'est pas la question de la question. Cependant, les questions / réponses Stackoverflow sont également utilisées par de nombreuses autres personnes arrivant ici via Google, comme je l'ai fait, et j'utilise MDB. J'espère que cette réponse est utile à quelqu'un d'autre.

  2. GUI Ouvrez MS Access GUI. Je n'ai pas compris comment faire cela sans cela, désolé, bien que ce soit probablement possible.

  3. aller aux outils ... Options ...

  4. Cliquez sur "Afficher" TAB

  5. Sélectionnez "Objets cachés", "Objets système"

  6. fermeture ferme

  7. aller à Outils ... Sécurité .. Autorisations de l'utilisateur et de groupe

  8. Sélectionnez tous les noms de table, y compris MSYSObjects

  9. Cliquez sur toutes les cases "Autorisations" afin qu'elles soient configurées comme "cochées" pour toutes les entrées

  10. Appliquer / OK au besoin


1 commentaires

J'ai abordé cela au point 1. La question ici est d'utiliser pour les personnes utilisant les deux formats. Si vous Google pour ce message d'erreur, ceci est la question de la présente question. Donc, avoir une réponse de travail pour certains vaut mieux que pas de réponse du tout.



16
votes

Étant donné que votre db est le format ACCDB, vous travaillerez en tant qu'utilisateur Admin em>. Vous pouvez confirmer ce point dans la fenêtre immédiate. (Allez-y avec Ctrl kbd> + g kbd>)

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


2 commentaires

+1 Excellent! Cela permet également à ACE / OLEDB d'accéder à MSYSObjects dans un fichier .Accdb de l'extérieur de l'accès.


Essayez cela avec une connexion ODBC et avec une fenêtre d'accès à l'interface utilisateur sur un fichier ACCDB - et c'est invalide SQL.