ストアドプロシージャの定義は次のとおりです。
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;
返信ありがとうございます。これは、解決策を見つけるのに間違いなく非常に厄介な問題でした。