Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Erro ORA-00942 está sendo gerado ao criar uma visualização


O primeiro passo para diagnosticar um problema ao criar uma visualização é tentar o select parte por conta própria. Nesse caso, você ainda receberia o erro ORA-00942, mas o problema agora é apenas uma questão de consulta e acesso e não tem a ver especificamente com a visualização.

Quando você obtém ORA-00942:tabela ou visualização não existe , é porque:

  1. O nome da tabela ou visualização que você digitou realmente não existe.

    • Verifique a ortografia - talvez haja um erro de digitação.

    • Você está conectado a um banco de dados onde ele existe? Talvez você esteja em um sistema de teste que não o tenha.

    • Consulta dba_objects para ver se a tabela existe em outro esquema. (Se você não tiver privilégios para consultar dba_objects, all_objects lista tudo o que você tem permissão para ver, o que pode ser de alguma ajuda.)

  2. Ele realmente existe, mas está em outro esquema.
    Nesse caso, há dois problemas possíveis:

    • Você não tem permissão para consultá-lo. O proprietário da tabela precisa grant read on xyz (substitua o nome real da tabela por xyz ) para qualquer

      • vocês

      • public (se você quiser que todos possam ver os dados, nem sempre é aconselhável)

      • uma função que você tem (mas as funções não são usadas por PL/SQL armazenado ou visualizações , no entanto, é possível que você possa consultar uma tabela em outro esquema graças a uma função que você possui, mas ainda não conseguir criar uma exibição ou um procedimento que a use.)

    • Você precisa especificar o esquema. Digamos que você queira consultar as REGIONS tabela em HR mas você está conectado como SCOTT . Se você apenas select * from regions ele procurará por SCOTT.REGIONS , que não existe. Para corrigir isso, siga um destes procedimentos:

      • use hr.regions explicitamente em sua consulta.

      • em seu esquema, create or replace synonym regions for hr.regions;
        Agora, sempre que você se referir a regions , o banco de dados redirecionará automaticamente para hr.regions .

      • em qualquer esquema com permissão para criar sinônimos públicos:
        create or replace public synonym regions for hr.regions;
        Agora todos que se conectarem ao banco de dados terão referências a regions redirecionado para hr.regions , o que nem sempre é uma boa ideia, mas é uma opção de qualquer maneira.

      • alter session set current_schema = hr;
        Agora o esquema padrão para resolver nomes de objetos é HR e não aquele em que você se conectou. Para aplicativos que sempre fazem login como um usuário diferente daquele que possui as tabelas, você pode criar um após o acionador de logon então isso é sempre definido. Em seguida, eles podem apenas se referir a regions etc sem precisar especificar nenhum esquema e sem sinônimos.