sql >> Base de Datos >  >> RDS >> Oracle

Se genera el error ORA-00942 al crear una vista

El primer paso para diagnosticar un problema al crear una vista es probar el select parte por sí solo. En este caso, aún obtendría el error ORA-00942, pero el problema ahora es solo un problema de consulta y acceso y no tiene que ver con la vista específicamente.

Cuando obtiene ORA-00942:la tabla o la vista no existe , es porque:

  1. El nombre de la tabla o vista que escribió realmente no existe.

    • Revisa la ortografía, tal vez haya un error tipográfico.

    • ¿Está conectado a una base de datos donde existe? Quizás esté en un sistema de prueba que no lo tiene.

    • Consulta dba_objects para ver si la tabla existe en otro esquema. (Si no tiene privilegios para consultar dba_objects, all_objects enumera todo lo que tiene permiso para ver, lo que puede ser de ayuda).

  2. Realmente existe, pero está en otro esquema.
    En ese caso, hay dos posibles problemas:

    • No tienes permiso para consultarlo. El propietario de la tabla debe grant read on xyz (sustituya el nombre real de la tabla por xyz ) a cualquiera

      • tu

      • public (si quieres que todos puedan ver los datos, no siempre recomendable)

      • un rol que tiene (pero los roles no son utilizados por PL/SQL almacenado o vistas , sin embargo, por lo que es posible que pueda consultar una tabla en otro esquema gracias a un rol que tenga, pero aún no pueda crear una vista o un procedimiento que lo use).

    • Debe especificar el esquema. Digamos que desea consultar las REGIONS tabla en HR pero estás conectado como SCOTT . Si simplemente select * from regions buscará SCOTT.REGIONS , que no existe. Para solucionarlo, realice una de las siguientes acciones:

      • usa hr.regions explícitamente en su consulta.

      • en su esquema, create or replace synonym regions for hr.regions;
        Ahora, siempre que se refiera a regions , la base de datos redirigirá automáticamente a hr.regions .

      • en cualquier esquema con permiso para crear sinónimos públicos:
        create or replace public synonym regions for hr.regions;
        Ahora todos los que se conecten a la base de datos tendrán referencias a regions redirigido a hr.regions , que no siempre es una buena idea, pero es una opción de todos modos.

      • alter session set current_schema = hr;
        Ahora el esquema predeterminado para resolver nombres de objetos es HR y no el que usted inició sesión. Para las aplicaciones que siempre inician sesión como un usuario diferente al propietario de las tablas, puede crear un después del activador de inicio de sesión así que esto siempre está configurado. Luego, solo pueden hacer referencia a regions etc. sin necesidad de especificar ningún esquema y sin sinónimos.