Oracle
 sql >> Database >  >> RDS >> Oracle

L'errore ORA-00942 viene generato durante la creazione di una vista

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é:

  1. 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.)

  2. 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 con xyz ) 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 in HR ma sei connesso come SCOTT . Se hai appena select * 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 a regions , il database reindirizzerà automaticamente a hr.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 a regions reindirizzato a hr.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 a regions ecc senza la necessità di specificare alcuno schema e senza alcun sinonimo.