S největší pravděpodobností je problém v tom, že grant byl proveden prostřednictvím role. Oprávnění udělená uživateli nejsou dostupná v uložené proceduře s právy definujícího (výchozí).
V SQL Developer je poměrně snadné ověřit, že jde o problém. Pokud spustíte příkaz
SET ROLE none
a poté spusťte příkaz SELECT, očekával bych, že dostanete stejnou chybu ORA-00942.
Za předpokladu, že tomu tak je, řešením by obecně bylo požádat vlastníky tabulek ve schématu YYY, aby udělili přístup k tabulkám přímo vám, nikoli prostřednictvím role. Pokud tomu tak není, můžete svou uloženou proceduru definovat jako uloženou proceduru s právy vyvolávače přidáním AUTHID CURRENT_USER do deklarace. To by znamenalo, že volající procedury by musel mít přístup k základním objektům, ale umožnilo by to vašim procedurám využívat oprávnění udělená prostřednictvím role.
Chcete-li vytvořit uloženou proceduru s právy vyvolávače, budete se také muset odkázat na název tabulky pomocí dynamického SQL, abyste odložili kontrolu oprávnění na běhové prostředí. Takže byste měli něco jako
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;
pokud jste chtěli uloženou proceduru s právy vyvolávače, která se dotazovala na tabulku TableA ve schématu XXX.