Oracle

執行 oracle 儲存過程時權限不足?

  • December 7, 2019

執行以下 oracle 儲存過程時出現權限不足錯誤。我正在使用 Oracle 數據庫 10g 快捷版。

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;

我正在使用從 CSV 更新 oracle sql 數據庫的文章來建構這個 SP。我可以成功編譯這個儲存過程。我擁有 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 執行上下文不包括 Role。所以你的權利已經被一個角色委派了。Pl/SQL 看不到它。因此,首先,您可以嘗試授予直接更改使用者的權限,而不是通過角色。第二,我會在包定義(auhtid)上嘗試這個選項,這裡解釋

在 MSSQL 中可能會出現類似的情況,但在 Oracle 中則不然。簡單地說,PL/SQL 是編譯語言,而不是腳本語言。Oracle 在後台“默默地”將其編譯為字節碼。您的過程的sp_update_acounts字節碼取決於表的定義crm_account_stage(實際上它取決於它的 object_id)。您的“eval” - 動態 sql - 刪除此對象,因此它使所有依賴對象無效。它們必須重新編譯。但他們不能,因為程序正在執行。

從 Oracle 的角度來看,這種方法是錯誤的。

對於 Oracle,經驗法則是:“避免將 DDL 用於業務邏輯”。

嘗試使用: alter table而不是dropand create。或者execute immediate也用於merge聲明。

引用自:https://dba.stackexchange.com/questions/49732