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

tabela oracle ou exibição não existe de dentro do procedimento armazenado


Muito provavelmente, o problema é que a concessão foi feita por meio de uma função. Privilégios concedidos a um usuário não estão disponíveis no procedimento armazenado de direitos de um definidor (o padrão).

No SQL Developer, é relativamente fácil verificar se esse é o problema. Se você executar o comando
SET ROLE none

e, em seguida, execute a instrução SELECT, eu esperaria que você recebesse o mesmo erro ORA-00942.

Supondo que seja esse o caso, a solução geralmente seria solicitar que os proprietários das tabelas no esquema YYY concedessem acesso às tabelas diretamente a você, em vez de conceder acesso por meio de uma função. Exceto isso, você pode definir seu procedimento armazenado como um procedimento armazenado de direitos do invocador adicionando AUTHID CURRENT_USER à declaração. Isso faria com que o chamador do procedimento precisasse ter acesso aos objetos subjacentes, mas permitiria que seus procedimentos fizessem uso de privilégios concedidos por meio de uma função.

Se você quiser criar um procedimento armazenado de direitos do invocador, também precisará consultar o nome da tabela usando SQL dinâmico para adiar a verificação de privilégios para o tempo de execução. Então você teria 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;

se você quisesse um procedimento armazenado de direitos do invocador que consultasse a tabela TableA no esquema XXX.