Hoogstwaarschijnlijk is het probleem dat de subsidie via een rol is gedaan. Bevoegdheden die aan een gebruiker zijn toegekend, zijn niet beschikbaar in de opgeslagen procedure voor de rechten van een definitie (de standaardinstelling).
In SQL Developer is het relatief eenvoudig om te controleren of dit het probleem is. Als u de opdracht
. uitvoertSET ROLE none
en voer vervolgens de SELECT-instructie uit, ik zou verwachten dat u dezelfde ORA-00942-fout zou krijgen.
Ervan uitgaande dat dit het geval is, zou de oplossing over het algemeen zijn om de eigenaren van de tabellen in het YYY-schema te vragen u rechtstreeks toegang tot de tabellen te verlenen in plaats van toegang te verlenen via een rol. Behalve dat, zou u uw opgeslagen procedure kunnen definiëren als een opgeslagen procedure van de rechten van een aanroeper door AUTHID CURRENT_USER toe te voegen aan de aangifte. Dat zou betekenen dat de aanroeper van de procedure toegang moet hebben tot de onderliggende objecten, maar dat uw procedures gebruik kunnen maken van privileges die via een rol zijn verleend.
Als u de opgeslagen procedure van een aanroeper wilt maken, moet u ook naar de tabelnaam verwijzen met dynamische SQL om de privilegecontrole uit te stellen tot runtime. Dus je zou zoiets hebben als
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;
als u de opgeslagen procedure van een aanroeper wilt die de tabel TableA in schema XXX opvraagt.