Oracle
執行 oracle 儲存過程時權限不足?
執行以下 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
而不是drop
andcreate
。或者execute immediate
也用於merge
聲明。