web-dev-qa-db-ja.com

Oracleストアドプロシージャの実行中に権限が不十分ですか?

次の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.

更新:ユーザーやパスワードを更新しようとはしていません。しかし、エラーメッセージには、ユーザーの詳細を変更しようとしていると表示されます。ストアドプロシージャの外で同じコードを少しずつ試してみると、問題なく実行されています。

これの理由は何でしょうか?どうすれば問題を解決できますか?

3
Suren Raju

Pl/sql実行コンテキストにはロールは含まれません。したがって、リスクは役割によって委任されています。 Pl/SQLはそれを認識しません。そのため、最初に、役割を介さずにユーザーを直接変更する権限を与えることを試みることができます。 2番目に、私は説明されているパッケージ定義(auhtid)でこのオプションを試します ここ

2
Nicolas Durand

そのようなものはMSSQLでは可能ですが、Oracleでは不可能です。単にPL/SQLはコンパイルされた言語ですが、スクリプト言語ではありません。 Oracleはバックグラウンドで「サイレント」にバイトコードにコンパイルします。プロシージャのsp_update_acountsバイトコードはテーブルの定義に依存しますcrm_account_stage(実際には、object_idに依存しています)。あなたの「評価」-動的SQL-このオブジェクトを削除するため、依存するすべてのオブジェクトが無効になります。それらは再コンパイルする必要があります。しかし、プロシージャが実行されているため、そうすることはできません。

このアプローチは、Oracleの観点からすると間違っています。

Oracleの経験則は次のとおりです。 "ビジネスロジックにDDLを使用しないでください"。

使用してみてください:alter tableの代わりにdropおよびcreate。またはexecute immediatemergeステートメントに使用します。

0
ibre5041