Problemi quando si interroga il database Oracle per l'elenco delle tabelle: “tabella o vista non esiste”
Domanda
Nel mio programma ho bisogno di accedere allo schema di database di Oracle 11g. Ho cercato di ottenere un elenco di tabelle utilizzando una query come questa:
SELECT t.TABLE_NAME, t.OWNER
FROM ALL_TABLES t
WHERE t.DROPPED = 'NO'
ORDER BY t.TABLE_NAME
La query funziona e io tornare un elenco di tabelle. Purtroppo quando si interroga alcune delle tabelle utilizzando il nome della tabella restituita ottengo il seguente errore:
ORA-00942: tabella o vista non esiste
Che cosa potrebbe causare questo errore? Potrebbe essere giù ai privilegi?
In una questione a parte io sono anche un po 'confuso circa se ci potrebbero potenzialmente essere due o tabelle con lo stesso nome e come avrei potuto distinguere tra i due. Ho bisogno di guardare fuori per questo?
Sto usando il provider Oracle.DataAccess in .NET per la connessione al database. Si tratta di un server remoto e l'accesso purtroppo ho molto limitata ad esso.
Soluzione
Potrebbe essere giù ai privilegi. Ma potrebbe essere giù al tavolo di essere in uno schema diverso, e non ci sia un sinonimo di esso. Funziona se si qualificano il nome della tabella con il proprietario? cioè selezionare [proprietario]. [nome_tabella] invece?
Altri suggerimenti
Solo perché si ha accesso alla visualizzazione ALL_TABLES non significa che si può effettivamente selezionare le tabelle di recuperare tramite questo punto di vista. È necessario la concessione appropriata selezionare sui tavoli per selezionarli.
2 tabelle possono avere lo stesso nome purché appartengono a uno schema diverso (il campo di applicazione è in realtà più ampia che solo le tabelle, uno schema non può avere due oggetti (tabella, vista ...) che hanno lo stesso nome)
Sì, è una caratteristica di sicurezza - se non hai il permesso di selezionare da un tavolo, Oracle normalmente nemmeno riconoscere a voi che esiste (un utente ordinario non sarebbe in grado di vedere le cose a selezionare dalla ALL_ a meno che è stato concesso dal DBA).