2009-12-21 5 views
5

Sto cercando di ottenere un elenco di tutte le tabelle da un database in formato ACCDB di Access 2007 utilizzando Excel VBA.Impossibile leggere il record; nessuna autorizzazione di lettura su "MSysObjects"

ho seguito questo post:

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

Usando:

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 

ma sto ottenendo questo errore.

La registrazione non può essere letta; nessun permesso di lettura su '' MSysObjects

voglio essere in grado di ottenere i nomi di tabella utilizzando solo un'istruzione SQL e non il metodo OpenSchema.

Penso che il problema sia con Access. Non ne sono sicuro.

Qualcuno ha qualche idea?

+0

Qual è il tuo ambiente di programmazione? Per cosa userete i risultati? –

+0

Inoltre, qual è il tuo formato di file: ACCDB o MDB? –

+0

Grazie per la tua domanda. Sto usando ACCDB. – VBGKM

risposta

0

Sembra un problema di autorizzazioni. Prova ad aprire il database e andare alle autorizzazioni di sicurezza (sotto Strumenti-> Sicurezza -> Autorizzazioni utente e gruppo) Assicurati di avere accesso amministratore al database.

Se non si potrebbe essere necessario accedere al database come un utente che fa e concedersi permessi

+0

-1 Strumenti-> Sicurezza-> Le autorizzazioni utente e di gruppo non esistono in Access 2007 – jaywon

+2

@jaywon: la selezione del menu esiste se si sta visualizzando un file MDB. Non verrà visualizzato se si sta visualizzando un file ACCDB, per il quale non è disponibile alcun supporto per la sicurezza a livello utente Jet. Quindi, il tuo commento è SBAGLIATO. –

2

Usa raccolta 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 
+0

Sembra ragionevole, ma l'OP dice "Voglio essere in grado di ottenere i nomi delle tabelle usando solo un'istruzione SQL" – Fionnuala

+0

Non c'è nulla nella domanda originale che suggerisce che questo viene fatto da Access esterno, quindi mi sembra che se avrai una lista di tavoli, farai qualcosa con loro. In mancanza dell'uso della stringa SQL come origine di righe di una combo/listbox, si utilizzerà il codice per utilizzare l'elenco risultante, nel qual caso non fa alcuna differenza se si utilizza la raccolta TableDefs attraverso l'oggetto Recordset in base a la dichiarazione SQL. –

+1

Remou, certo, ha detto solo usando un'istruzione SQL. Immagino che se non ha ancora una risposta, dovrebbe provare alternative. –

0

ero in grado di rendere il codice di lavoro con un file MDB. Ho avuto la possibilità di impostare le autorizzazioni utente utilizzando "Strumenti database - Utenti e autorizzazioni" sulla barra multifunzione. Questa opzione è disponibile solo per i file MDB. Ora il problema è farlo funzionare con un file ACCDB.

Ecco il mio codice:

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 

Il problema è che non riesco a farlo funzionare con i file ACCDB.

+0

Stai eseguendo il codice da Access o Excel? –

1

Ecco cosa ha funzionato per me, dal momento che questa è la prima domanda che viene SO per questo:

  1. questo è un file MDB. Non so degli altri. Capisco che questo non è quello che la domanda ha chiesto. Tuttavia, le domande/risposte StackOverflow vengono utilizzate anche da molte altre persone che arrivano qui tramite google, come ho fatto io, e sto usando MDB. Spero che questa risposta sia utile a qualcun altro.

  2. Aprire la GUI di MS Access. Non ho capito come farlo senza di esso, mi dispiace, anche se è probabile che sia possibile.

  3. Vai a Strumenti ... Opzioni ...

  4. Fare clic sulla scheda "Visualizza"

  5. selezionare "oggetti nascosti", "Oggetti di sistema"

  6. vicino scheda

  7. andare in Strumenti ... Sicurezza .. autorizzazioni di utenti e gruppi

  8. selezionare tutti i nomi delle tabelle tra cui MSysObjects

  9. clicca tutti i "permessi" caselle di controllo in modo da impostare come "controllato" per tutte le voci

  10. Applica/OK, se necessario

+0

L'ho affrontato al punto # 1. La domanda qui è utile alle persone che utilizzano entrambi i formati. Se cerchi questo messaggio di errore, questa è la domanda SO che viene visualizzata. Quindi avere una risposta funzionante per alcuni è meglio che non avere alcuna risposta. – zzzeek

7

Dal momento che il db è formato ACCDB, si dovrà lavorare come utente Admin. Puoi confermare quel punto nella finestra Immediata. (Vai lì con Ctrl +g)

? CurrentUser() 
Admin 

Dal permesso Admin non di lettura (SELECT) su MSysObjects, eseguire un'istruzione DDL per dare Admin quel permesso.

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

+1 Eccellente! Ciò consente inoltre a ACE/OLEDB di accedere a MSysObjects in un file .accdb dall'esterno di Access. – agentnega