次のOracleストアドプロシージャの実行中に、権限不足エラーが発生します。 Oracle Database 10g Express Editionを使用しています。
CREATE OR REPLACE
PROCEDURE sp_update_acounts(
accounts_file_dir IN VARCHAR2,
accounts_file_name IN VARCHAR2)
IS
BEGIN
EXECUTE IMMEDIATE 'CREATE OR REPLACE DIRECTORY ext_accounts_dir AS '''||accounts_file_dir||'''';
EXECUTE IMMEDIATE 'grant read, write on directory ext_accounts_dir to myuser';
EXECUTE IMMEDIATE 'drop table crm_account_stage';
EXECUTE IMMEDIATE 'CREATE TABLE crm_account_stage (entity_account_id NUMBER(19,0), crm_id VARCHAR2(255 CHAR)) ORGANIZATION EXTERNAL (TYPE Oracle_LOADER DEFAULT DIRECTORY
ext_accounts_dir ACCESS PARAMETERS (FIELDS TERMINATED BY '','' ( entity_account_id CHAR(225), crm_id CHAR(225))) LOCATION ('''||accounts_file_name||''''||') )';
MERGE INTO ua_crm_accounts acc
USING (
SELECT entity_account_id,
crm_id
FROM crm_account_stage) acc_stage
ON (acc_stage.entity_account_id = acc.pkey)
WHEN MATCHED THEN
UPDATE SET acc.crm_id = acc_stage.crm_id;
END;
私はこのSPをビルドするためにポスト CSVからOracle SQLデータベースを更新 を使用しています。このストアドプロシージャを正常にコンパイルできました。私は管理者なので、Oracleユーザーのすべての権限を持っています。私はすべての可能な権利を与えました。
しかし、SPを実行すると、次のようなエラーが発生します。
Error starting at line 13 in command:
execute sp_update_acounts('C:\Users\surenr\Desktop\UA\Intitial-Conversion','acc_data.csv')
Error report:
ORA-01031: insufficient privileges
ORA-06512: at "myuser.SP_UPDATE_ACOUNTS", line 7
ORA-06512: at line 1
01031. 00000 - "insufficient privileges"
*Cause: An attempt was made to change the current username or password
without the appropriate privilege. This error also occurs if
attempting to install a database without the necessary operating
system privileges.
When Trusted Oracle is configure in DBMS MAC, this error may occur
if the user was granted the necessary privilege at a higher label
than the current login.
*Action: Ask the database administrator to perform the operation or grant
the required privileges.
For Trusted Oracle users getting this error although granted the
the appropriate privilege at a higher label, ask the database
administrator to regrant the privilege at the appropriate label.
更新:ユーザーやパスワードを更新しようとはしていません。しかし、エラーメッセージには、ユーザーの詳細を変更しようとしていると表示されます。ストアドプロシージャの外で同じコードを少しずつ試してみると、問題なく実行されています。
これの理由は何でしょうか?どうすれば問題を解決できますか?
Pl/sql実行コンテキストにはロールは含まれません。したがって、リスクは役割によって委任されています。 Pl/SQLはそれを認識しません。そのため、最初に、役割を介さずにユーザーを直接変更する権限を与えることを試みることができます。 2番目に、私は説明されているパッケージ定義(auhtid)でこのオプションを試します ここ
そのようなものはMSSQLでは可能ですが、Oracleでは不可能です。単にPL/SQLはコンパイルされた言語ですが、スクリプト言語ではありません。 Oracleはバックグラウンドで「サイレント」にバイトコードにコンパイルします。プロシージャのsp_update_acounts
バイトコードはテーブルの定義に依存しますcrm_account_stage
(実際には、object_idに依存しています)。あなたの「評価」-動的SQL-このオブジェクトを削除するため、依存するすべてのオブジェクトが無効になります。それらは再コンパイルする必要があります。しかし、プロシージャが実行されているため、そうすることはできません。
このアプローチは、Oracleの観点からすると間違っています。
Oracleの経験則は次のとおりです。 "ビジネスロジックにDDLを使用しないでください"。
使用してみてください:alter table
の代わりにdrop
およびcreate
。またはexecute immediate
もmerge
ステートメントに使用します。