40

ストアドプロシージャの定義は次のとおりです。

CREATE OR REPLACE PROCEDURE usp_dropTable(schema VARCHAR, tblToDrop VARCHAR) IS
BEGIN
  DECLARE v_cnt NUMBER;
  BEGIN
    SELECT COUNT(*) 
      INTO v_cnt 
      FROM all_tables 
     WHERE owner = schema
       AND table_name = tblToDrop;

     IF v_cnt > 0 THEN 
        EXECUTE IMMEDIATE('DROP TABLE someschema.some_table PURGE');
     END IF;
   END;
END;

呼び出しは次のとおりです。

CALL usp_dropTable('SOMESCHEMA', 'SOME_TABLE');

何らかの理由で、EXECUTEIMMEDIATEコマンドに対して不十分な特権エラーが発生し続けます。オンラインで調べたところ、不十分な権限エラーは通常、Oracleユーザーアカウントに、渡されるクエリで使用されるコマンド(この場合はDROP)に対する権限がないことを意味します。ただし、ドロップ権限があります。私は本当に混乱していて、自分に合った解決策を見つけることができないようです。

よろしくお願いします。

解決:

スティーブが以下に述べるように、Oracleのセキュリティモデルは、プロシージャのどこかで使用する特権の種類を明示的に知る必要があるという点で奇妙です。これをOracleに通知する方法は、CREATEORREPLACEステートメントでAUTHIDキーワードを使用することです。プロシージャの作成者と同じレベルの特権が必要な場合は、AUTHIDDEFINERを使用します。Oracleで現在ストアドプロシージャを実行しているユーザーの権限を使用する場合は、AUTHIDCURRENT_USERを使用します。プロシージャ宣言は次のようになります。

CREATE OR REPLACE PROCEDURE usp_dropTable(schema VARCHAR, tblToDrop VARCHAR) 
AUTHID CURRENT_USER IS
BEGIN
  DECLARE v_cnt NUMBER;
  BEGIN
    SELECT COUNT(*) 
      INTO v_cnt 
      FROM all_tables 
     WHERE owner = schema
       AND table_name = tblToDrop;

     IF v_cnt > 0 THEN 
        EXECUTE IMMEDIATE('DROP TABLE someschema.some_table PURGE');
     END IF;
   END;
END;

返信ありがとうございます。これは、解決策を見つけるのに間違いなく非常に厄介な問題でした。

4

4 に答える 4

21

Oracle のセキュリティ モデルでは、(PL/SQL ブロックまたはプロシージャのコンテキスト内で) Execute Immediate を使用して動的 SQL を実行する場合、ユーザーは、ロール メンバーシップを介して付与されたオブジェクトまたはコマンドに対する権限を持ちません。ユーザーはおそらく「DBA」ロールまたは同様のものを持っています。このユーザーに「テーブルのドロップ」権限を明示的に付与する必要があります。別のスキーマ (sys や system など) のテーブルから選択しようとしている場合も同様です。そのテーブルに対する明示的な SELECT 権限をこのユーザーに付与する必要があります。

于 2009-06-15T15:16:55.770 に答える
5

要件に応じて、プロシージャ定義の本文で「AUTHID CURRENT_USER」を使用できます。

于 2016-08-21T09:07:05.663 に答える
0

または、必要に応じてユーザー権限を付与することもできます。このDROP_ANY_TABLE場合、手順は変更する必要なくそのまま実行されます。危険かもしれませんが、あなたが何をしているかによります:)

于 2011-06-04T09:54:43.903 に答える