Pregunta

He creado un paquete que contiene un procedimiento almacenado que planeo para invocar desde una aplicación separada. El procedimiento almacenado devolverá una lista ordenada de todos los puntos de vista y las tablas en el esquema. Para ello, se realiza una sencilla selección en los sinónimos dba_tables y DBA_VIEWS, como se muestra a continuación:

CREATE OR REPLACE
PACKAGE BODY TITAN_ENTITY AS

  PROCEDURE GETSCHEMAOBJECTS (RESULTS IN OUT T_CURSOR)
  IS
    V_CURSOR T_CURSOR;
  BEGIN
    OPEN V_CURSOR FOR
       SELECT 'T' OBJECTTYPE, TABLE_NAME OBJECTNAME 
          FROM DBA_TABLES 
          WHERE OWNER = 'SONAR5'
       UNION ALL
       SELECT 'V' OBJECTTYPE, VIEW_NAME OBJECTNAME 
         FROM DBA_VIEWS 
         WHERE OWNER = 'SONAR5'
       ORDER BY OBJECTNAME;
    RESULTS := V_CURSOR;      

  END GETSCHEMAOBJECTS;

END TITAN_ENTITY;

He comprobado que existen los sinónimos en cuestión, y son públicos:

CREATE PUBLIC SYNONYM "DBA_TABLES" FOR "SYS"."DBA_TABLES"
CREATE PUBLIC SYNONYM "DBA_VIEWS" FOR "SYS"."DBA_VIEWS"

Mi entendimiento es que, debido a que son públicos, no necesito ningún permiso más para llegar a ellos. Si el entendimiento de que es incorrecta, me gustaría que alguien me desengañar de la noción y me punto a datos más precisos.

Ahora aquí está mi problema: Puedo abrir una hoja de trabajo en Oracle SQL Developer y seleccione una de estas tablas muy bien. Consigo datos significativos bien (567 filas, como una cuestión de hecho). Pero cuando trato de ejecutar el procedimiento almacenado, Oracle se queja con un error de compilación, como se muestra a continuación:

Error(9,8): PL/SQL: SQL Statement ignored
Error(10,16): PL/SQL: ORA-00942: table or view does not exist

Cuando hago doble clic en ese segundo mensaje de error, SQL Developer me lleva a la primera cláusula FROM ( "DE DBA_TABLES").

Así que estoy bastante perplejo. Sé SQL Server bastante bien, y soy nuevo en Oracle, así que por favor tengan paciencia conmigo. Si usted podría dar algunas pistas, o que me señale en la dirección correcta, lo agradecería mucho.

Gracias de antemano!

¿Fue útil?

Solución

Uso ALL_TABLES y ALL_VIEWS en lugar de DBA_TABLES y DBA_VIEWS. ALL_ vistas% debe ser accesible a todos los usuarios.

Otros consejos

Si selecciona de una tabla o una vista en un / SQL-PL procedimiento almacenado o un / SQL-PL función almacenada necesita una subvención directa. Una donación a través de un papel de base de datos no es suficiente.

Es probable que tenga una subvención directa de visión dba_tables. sinónimos (públicos) son sólo sinónimos (públicas). Usted necesita concede seleccionar directamente los derechos.

Vea aquí: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:48704116042682#48798240264807

Editar Lo siento, me pasó por alto la parte en la que parece que decir que se puede seleccionar entre DBA_TABLES directamente. Lo más probable es que el problema de sus privilegios se conceden a través de un papel de otra persona respondió. Pero es todavía vale la pena explicar que su comprensión de sinónimos públicos es incompleta, y que el uso de ALL_TABLES sería mejor si se logra lo que necesita.

El sinónimo ser público sólo significa que todos los usuarios pueden hacer referencia el sinónimo; no les concede ningún acceso al objeto que hace referencia el sinónimo a.

Lo que haría que más directamente solucionar este error es otorgar el privilegio SELECT en las vistas SYS para el usuario (s) que se ejecutará este procedimiento. Sin embargo, creo que es un muy mala idea.

Según lo sugerido por Raimonds, considere si puede obtener lo que necesita de USER_TABLES o ALL_TABLES lugar. Lo que el usuario está llamando a este procedimiento, y lo que hace el acceso que el usuario tiene a las tablas de SONAR5?

En general, si la aplicación está interesada en una mesa, es de suponer que tiene algunos privilegios en ella, en cuyo caso se deben enumerar en ALL_TABLES.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top