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

la tabla o vista de Oracle no existe desde el interior del procedimiento almacenado

Lo más probable es que el problema sea que la concesión se realizó a través de un rol. Los privilegios otorgados a un usuario no están disponibles en un procedimiento almacenado de derechos del definidor (predeterminado).

En SQL Developer, es relativamente fácil verificar que este es el problema. Si ejecuta el comando

SET ROLE none

y luego ejecute la declaración SELECT, espero que obtenga el mismo error ORA-00942.

Suponiendo que ese sea el caso, la solución generalmente sería pedir que los propietarios de las tablas en el esquema YYY le otorguen acceso a las tablas directamente en lugar de otorgarle acceso a través de un rol. Salvo eso, podría definir su procedimiento almacenado como un procedimiento almacenado de derechos del invocador agregando AUTHID CURRENT_USER a la declaración. Eso significaría que la persona que llama al procedimiento necesitaría tener acceso a los objetos subyacentes, pero permitiría que sus procedimientos hagan uso de los privilegios otorgados a través de un rol.

Si desea crear un procedimiento almacenado de derechos de invocador, también deberá hacer referencia al nombre de la tabla mediante SQL dinámico para diferir la verificación de privilegios al tiempo de ejecución. Entonces tendrías algo como

CREATE OR REPLACE PROCEDURE PRC_SOMESP 
  AUTHID CURRENT_USER
AS 
  l_cnt pls_integer;
BEGIN
  EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM yyy.TableA' INTO l_cnt;
END PRC_SOMESP;

si quisiera un procedimiento almacenado de derechos de invocador que consultara la tabla TableA en el esquema XXX.