Il primo passaggio per diagnosticare un problema durante la creazione di una vista è provare a select
parte da solo. In questo caso otterresti comunque l'errore ORA-00942, ma il problema ora è solo una query e un problema di accesso e non ha a che fare con la vista in modo specifico.
Quando ottieni ORA-00942:la tabella o la vista non esiste , è perché:
-
Il nome della tabella o della vista che hai digitato in realtà non esiste.
-
Controlla l'ortografia:forse c'è un errore di battitura.
-
Sei connesso a un database dove esiste? Forse sei su un sistema di test che non lo ha.
-
Interroga
dba_objects
per vedere se la tabella esiste in un altro schema. (Se non hai i privilegi per interrogare dba_objects,all_objects
elenca tutto ciò che hai il permesso di visualizzare, il che potrebbe essere di aiuto.)
-
-
Esiste davvero, ma è in un altro schema.
In tal caso, ci sono due possibili problemi:-
Non hai il permesso per interrogarlo. Il proprietario della tabella deve
grant read on xyz
(sostituisci il nome effettivo della tabella conxyz
) in uno dei due-
tu
-
public
(se vuoi che tutti possano vedere i dati, non sempre consigliabile) -
un ruolo che hai (ma i ruoli non vengono utilizzati da PL/SQL archiviato o viste , tuttavia, è possibile che tu possa interrogare una tabella in un altro schema grazie a un ruolo che hai, ma non essere comunque in grado di creare una vista o una procedura che la utilizzi.)
-
-
Devi specificare lo schema. Supponi di voler interrogare le
REGIONS
tabella inHR
ma sei connesso comeSCOTT
. Se hai appenaselect * from regions
cercheràSCOTT.REGIONS
, che non esiste. Per risolvere il problema, esegui una delle seguenti operazioni:-
usa
hr.regions
esplicitamente nella tua richiesta. -
nel tuo schema,
create or replace synonym regions for hr.regions;
Ora ogni volta che fai riferimento aregions
, il database reindirizzerà automaticamente ahr.regions
. -
in qualsiasi schema con autorizzazione per creare sinonimi pubblici:
create or replace public synonym regions for hr.regions;
Ora chiunque si connetta al database avrà qualsiasi riferimento aregions
reindirizzato ahr.regions
, che non è sempre una buona idea, ma è comunque un'opzione. -
alter session set current_schema = hr;
Ora lo schema predefinito per la risoluzione dei nomi degli oggetti èHR
e non quello a cui hai effettuato l'accesso. Per le applicazioni che accedono sempre come un utente diverso da quello che possiede le tabelle, puoi creare un dopo il trigger di accesso quindi questo è sempre impostato. Quindi possono semplicemente fare riferimento aregions
ecc senza la necessità di specificare alcuno schema e senza alcun sinonimo.
-
-