Oracle
 sql >> Database >  >> RDS >> Oracle

la tabella o la vista Oracle non esiste dall'interno della procedura memorizzata

Molto probabilmente, il problema è che la sovvenzione è stata effettuata tramite un ruolo. I privilegi concessi a un utente non sono disponibili nella stored procedure di un definitore (impostazione predefinita).

In SQL Developer, è relativamente facile verificare che questo sia il problema. Se esegui il comando

SET ROLE none

e quindi eseguire l'istruzione SELECT, mi aspetto che venga visualizzato lo stesso errore ORA-00942.

Supponendo che sia così, la soluzione sarebbe generalmente chiedere ai proprietari delle tabelle nello schema YYY di concedere l'accesso alle tabelle direttamente a te anziché concedere l'accesso tramite un ruolo. Salvo ciò, puoi definire la tua procedura memorizzata come procedura memorizzata dei diritti di un invocatore aggiungendo AUTHID CURRENT_USER alla dichiarazione. Ciò significherebbe che il chiamante della procedura dovrebbe avere accesso agli oggetti sottostanti ma consentirebbe alle tue procedure di utilizzare i privilegi concessi tramite un ruolo.

Se si desidera creare una procedura memorizzata dei diritti dell'invocatore, sarà necessario fare riferimento anche al nome della tabella utilizzando l'SQL dinamico per rinviare il controllo dei privilegi al runtime. Quindi avresti qualcosa come

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 volevi una procedura memorizzata dei diritti di un invocatore che interrogasse la tabella TableA nello schema XXX.