ほとんどの場合、問題は、付与が役割を介して行われたことです。ユーザーに付与された特権は、定義者の権限ストアドプロシージャでは使用できません(デフォルト)。
SQL Developerでは、これが問題であることを確認するのは比較的簡単です。コマンドを実行した場合
SET ROLE none
次にSELECTステートメントを実行すると、同じORA-00942エラーが発生することが予想されます。
その場合、解決策は通常、YYYスキーマのテーブルの所有者に、ロールを介したアクセスを許可するのではなく、テーブルへのアクセスを直接許可するように依頼することです。それを除けば、宣言にAUTHID CURRENT_USERを追加することにより、ストアドプロシージャを呼び出し側の権限のストアドプロシージャとして定義できます。つまり、プロシージャの呼び出し元は基になるオブジェクトにアクセスできる必要がありますが、プロシージャはロールを通じて付与された特権を利用できます。
呼び出し側の権限ストアドプロシージャを作成する場合は、特権チェックを実行時に延期するために、動的SQLを使用してテーブル名を参照する必要もあります。だからあなたは
のようなものを持っているでしょう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;
スキーマXXXのTableAテーブルを照会する呼び出し元の権限ストアドプロシージャが必要な場合。