Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

[SOLUCIONADO] Error al listar esquemas ()

Estas en el tema de Error al listar esquemas () en el foro de Oracle en Foros del Web. Buenas, Cuando ejecuto la siguiente consulta con el usuario system @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código SQL: Ver original SELECT * FROM dba_users; Me lista todos los usuarios ...
  #1 (permalink)  
Antiguo 11/10/2014, 08:13
 
Fecha de Ingreso: octubre-2014
Ubicación: Lima
Mensajes: 74
Antigüedad: 9 años, 6 meses
Puntos: 1
Error al listar esquemas ()

Buenas,
Cuando ejecuto la siguiente consulta con el usuario system
Código SQL:
Ver original
  1. SELECT * FROM dba_users;
Me lista todos los usuarios (esquemas u owners) de la BD, pero cuando intento colocar la misma consulta dentro de un procedimiento almacenado, me lanza el siguiente error al compilar el package:
Código BASH:
Ver original
  1. Error(416,12): PL/SQL: ORA-00942: table or view does not exist

No entiendo por qué me dice que no existe, si cuando lo ejecuto en una simple consulta fuera del procedimiento, devuelve el conjunto de resultados,

Favor su apoyo en aclararme,

Muchas gracias, saludos.

Última edición por gnzsoloyo; 11/10/2014 a las 09:26
  #2 (permalink)  
Antiguo 11/10/2014, 08:20
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Error al listar esquemas ()

A mi entender es problema de permisos.
El user que tiene la ejecución del procedimiento debe tener también permisos para ver la tabla o vista en cuestión. De lo contrario el SP no la "ve".
Por otro lado, esa tabla requiere permisos de SYS, si no me equivoco. Creo que hay otra similar más accesible.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 11/10/2014 a las 09:27
  #3 (permalink)  
Antiguo 11/10/2014, 13:19
 
Fecha de Ingreso: octubre-2014
Ubicación: Lima
Mensajes: 74
Antigüedad: 9 años, 6 meses
Puntos: 1
Respuesta: Error al listar esquemas ()

Cita:
Iniciado por gnzsoloyo Ver Mensaje
A mi entender es problema de permisos.
El user que tiene la ejecución del procedimiento debe tener también permisos para ver la tabla o vista en cuestión. De lo contrario el SP no la "ve".
Por otro lado, esa tabla requiere permisos de SYS, si no me equivoco. Creo que hay otra similar más accesible.
He creado un nuevo usuario usrrex y le he asignado el rol dba, con esto ya tiene permiso para ver aparentemente "todos" los objetos de la BD y asimismo ejecutar "cualquier" package, sin embargo, sigue sin poder ver la vista dba_users. Al tratar de asignarle adicionalmente el rol sysdba (con el usuario system):

Código:
grant sysdba to usrrex;
Me lanza error de privilegio:

Código:
Error que empieza en la línea: 48 del comando :
grant sysdba to usrrex
Informe de error -
Error SQL: ORA-01031: insufficient privileges
01031. 00000 -  "insufficient privileges"
*Cause:    An attempt was made to perform a database operation without
           the necessary privileges.
*Action:   Ask your database administrator or designated security
           administrator to grant you the necessary privileges
Al parecer el usuario system no tiene los suficientes privilegios para asignar dicho rol.

Última edición por eduar2083; 11/10/2014 a las 13:27
  #4 (permalink)  
Antiguo 11/10/2014, 16:38
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Error al listar esquemas ()

Empecemos por el principio: ¿Para que necesitas acceder a esa tabla desde un procedimiento?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 11/10/2014, 18:01
 
Fecha de Ingreso: octubre-2014
Ubicación: Lima
Mensajes: 74
Antigüedad: 9 años, 6 meses
Puntos: 1
Respuesta: Error al listar esquemas ()

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Empecemos por el principio: ¿Para que necesitas acceder a esa tabla desde un procedimiento?
Sucede que estoy trabajando con la vista sys.all_objects para listar todos los objetos de la BD asociados a una conexión (este listado se volcará hacia la grilla de una aplicación). A su vez, el listado permitirá ser filtrado por 3 campos (owner, object_type y object_name). Los 2 primeros filtros irán en combos, donde la lista de owners la he obtenido a partir de la siguiente select hacia la misma vista:
Código SQL:
Ver original
  1. PROCEDURE pr_ListOwner
  2. (
  3.     pCursor OUT sys_refcursor
  4. )
  5. AS
  6. BEGIN
  7.     OPEN pCursor FOR
  8.     SELECT DISTINCT
  9.         a.owner
  10.     FROM all_objects a
  11.     ORDER BY owner ASC;
  12. exception
  13.   WHEN others THEN
  14.      raise_application_error(sqlcode, sqlerrm);
  15. END;

Como puedes ver, los owner los obtengo desde la misma vista que contiene los objetos, pero investigando un poco encontré que podía reemplazar por:
Código SQL:
Ver original
  1. PROCEDURE pr_ListOwner
  2. (
  3.     pCursor OUT sys_refcursor
  4. )
  5. AS
  6. BEGIN
  7.     OPEN pCursor FOR
  8.     SELECT
  9.         a.username
  10.     FROM dba_users a
  11.     ORDER BY username ASC;
  12. exception
  13.   WHEN others THEN
  14.      raise_application_error(sqlcode, sqlerrm);
  15. END;
Pero es aquí donde no me permite acceder a la vista dba_users desde el interior del procedimiento del package.

La lista de object_type la obtengo de manera análoga con una select hacia la misma vista:
Código SQL:
Ver original
  1. PROCEDURE pr_ListObjectType
  2. (
  3.     pCursor OUT sys_refcursor
  4. )
  5. AS
  6.     BEGIN
  7.     OPEN pCursor FOR
  8.     SELECT DISTINCT
  9.         a.object_type
  10.     FROM all_objects a
  11.     ORDER BY a.object_type ASC;
  12. exception
  13.     WHEN others THEN
  14.         raise_application_error(sqlcode, sqlerrm);
  15. END;
Para esta si no he encontrado una vista para reemplazarla sin utilizar la vista all_objects, pero de momento va bien, el problema es con el stored anterior que deseo reemplazar para volcar los owners hacia la aplicación pero accediendo a la vista dba_users.

Última edición por gnzsoloyo; 11/10/2014 a las 18:03 Razón: MUY MAL ETIQUETADO. Usar Highlight "SQL", por favor.
  #6 (permalink)  
Antiguo 11/10/2014, 18:16
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Error al listar esquemas ()

Mira, las vistas que comienzan con "DBA_" son vistas de acceso restringido y se puede decir que hasta peligroso. Son vistas que requieren grants de nivel SYS, y por consecuencia dar permisos de ese tipo a una aplicación no es una buena idea.
Paara que quede más claro el error que recibes, esas vistas se encuentran en el esquema SYS, y si el usuario que utilizas no tiene permisos para ver ese esquema, no podrás acceder a ellas.
Por otra parte, si lo que necesitas es acceder a los usuarios registrados, es innecesario (hasta cierto nivel), y para ello puedes usar tanto ALL_USERS, como USER_USERS, que son de un nivel de seguridad más bajo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 19/10/2014, 10:29
 
Fecha de Ingreso: octubre-2014
Ubicación: Lima
Mensajes: 74
Antigüedad: 9 años, 6 meses
Puntos: 1
Respuesta: Error al listar esquemas ()

Hola,
Aprovecho el mismo hilo para que por favor me aclaren otra duda similar. Necesito que un Rol llamado Administrador pueda hacer select a la vista v$tablespace ya que actualmente no tiene acceso, al ejecutar la siguiente consulta, me lanza error:
Código SQL:
Ver original
  1. SELECT * FROM v$tablespace;
Cita:
00942. 00000 - "table or view does not exist"
Para ello le he dado privilegio desde la cuenta sys:
Código SQL:
Ver original
  1. GRANT SELECT ON v_$tablespace FROM Administrador
Con esto, el usuario usrrex ya puede ejecutar la consulta sin problemas y lista los tablespace de la BD:
Cita:
0 SYSTEM YES NO YES
2 UNDOTBS1 YES NO YES
1 SYSAUX YES NO YES
4 USERS YES NO YES
3 TEMP NO NO YES
5 TS_REX_DAT YES NO YES
6 TS_REX_IDX YES NO YES
Ahora bien, nuevamente me lanza error si intento referenciar la vista desde un procedimiento almacenado dentro de un package, indicándome que la vista no existe. El usuario usrrex ya tiene grant para crear procedimientos.

Favor su apoyo, muchas gracias.
  #8 (permalink)  
Antiguo 20/10/2014, 07:32
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Error al listar esquemas ()

Por omisión, los procedimientos se crean con permisos de DEFINER, es decir, con los privilegios de el esquema que definió el procedimiento. Por esta razón, el error se muestra ya que el usuario usrrex no tiene privilegios sobre esa vista como si lo tiene administrador.

Tienes 2 opciones:
Agregar el mismo privilegio explicito (no por medio de un rol) al usuario usrrex o bien, modificar el procedimiento para que no sea invoker rights, sino definer rights.

Te dejo un enlace donde se explica el tema
http://docs.oracle.com/database/121/...r.htm#DBSEG658


Saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming

Etiquetas: procedimiento, select
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:02.