sql >> データベース >  >> RDS >> Oracle

ストアドプロシージャ内からのOracleテーブルまたはビューは存在しません

    ほとんどの場合、問題は、付与が役割を介して行われたことです。ユーザーに付与された特権は、定義者の権限ストアドプロシージャでは使用できません(デフォルト)。

    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テーブルを照会する呼び出し元の権限ストアドプロシージャが必要な場合。



    1. 一重引用符を回避する衛生状態は、SQL ServerのSQLインジェクションによってどのように打ち負かされますか?

    2. クライアントPCでのLocalDBの展開

    3. 長所と短所を使用してSQLServerテーブルの行をカウントする4つの方法

    4. Access2016で分割データベースを暗号化する方法