解決執行儲存過程出現許可權不足問題(ORA-01031)
今天同事下午問我ORA-01031問題,在測試資料庫上,在儲存過程中用EXECUTE IMMEDIATE 'CREATE TABLE '出現ORA-01031錯誤。
一、我先確認一下使用者許可權:
SQL> select * from dba_role_privs
2 where grantee = 'MAHANSO';
GRANTEE GRANTED_ROLE ADMIN_ DEFAUL
-------------------- -------------------- ------ ------
MAHANSO DBA NO YES
MAHANSO RESOURCE NO YES
MAHANSO CONNECT NO YES
dba許可權都有,沒有問題啊。
二、test下儲存過程。找到出現問題程式碼:
EXECUTE IMMEDIATE 'create table FUND_MONEY_GBAK as select * from FUND_MONEY';
我放到匿名過程中可以執行。
declare
begin
EXECUTE IMMEDIATE 'create table FUND_MONEY_GBAK as select * from FUND_MONEY';
end;
匿名的儲存過程可以執行 :EXECUTE IMMEDIATE 'create table FUND_MONEY_GBAK as select * from FUND_MONEY';
滿腦袋問號。
三、在網上找到詳細解釋:
預設情況下,在呼叫儲存過程使用者的角色是不起作用的,即在執行儲存過程時只有Public許可權。所以如果被呼叫的儲存過程中如果有execute immediate 'create table..'語句,將會引發ORA-01031: insufficient privileges錯誤。
儲存過程分為兩種,即DR(Definer's Rights ) Procedure和IR(Invoker's Rights ) Procedure。為什麼會有兩種儲存過程呢?其實考慮完下面的問題就清楚了。比如說使用者hrch建立了刪除表tar_table的儲存過程drop_table(),當使用者hrch呼叫時,即刪除使用者hrch下的表tar_table;如果是另一個使用者scott呼叫呢?是刪除使用者scott下的tar_table表呢,還是刪除使用者hrch下的tar_table呢?另外,如果儲存過程中包含建表語句,不管是使用者hrch還是使用者scott呼叫都會失敗,因為Public沒有建表許可權,除非為Public grant建表許可權。所以,儲存過程的呼叫者會面臨兩個問題:
儲存過程的名稱解析環境
儲存過程的執行許可權
這兩個問題可以在定義儲存過程時,透過指定AUTHID 屬性,即定義DR Procedure 和IR Procedure來解決。
DR Procedure
1、定 義
CREATE OR REPLACE procedure DEMO(ID in NUMBER) AUTHID DEFINER as
...
BEGIN
...
END DEMO;
2、名稱解析環境為定義該儲存過程的使用者所在的Schema。
3、執行該儲存過程時只有Public許可權。
IR Procedure
1、定 義
CREATE OR REPLACE procedure DEMO(ID in NUMBER) AUTHID CURRENT_USER as
...
BEGIN
...
END DEMO;
2、名稱解析環境為呼叫該儲存過程的使用者所在的Schema。
3、執行該儲存過程時擁有呼叫者的所有許可權,即呼叫者的Role是有效的。
如果不指定AUTHID,預設值是DEFINER。另外匿名塊(DECLARE BEGIN END;)總是IR Procedure,觸發器和檢視總是DR Procedure。我們可以透過檢視*_PROCEDURES來檢視儲存過程的AUTHID屬性值。
注:儲存過程、包、都適用。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12272958/viewspace-686460/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【許可權】儲存過程執行時,報ORA-01031許可權不足儲存過程
- MySQL儲存過程的許可權問題MySql儲存過程
- ORACLE中儲存過程的許可權問題Oracle儲存過程
- 呼叫者儲存過程訪問許可權問題儲存過程訪問許可權
- 儲存過程與許可權儲存過程
- MYSQL儲存過程許可權問題分析(Security_type詳解)MySql儲存過程
- Vim儲存時許可權不足
- all許可權使用者無法執行儲存過程儲存過程
- 儲存過程與許可權(二)儲存過程
- 在儲存過程中使用EXECUTE IMMEDIATE報許可權問題儲存過程
- mysql儲存過程的許可權 definerMySql儲存過程
- 資料庫許可權-儲存過程資料庫儲存過程
- 關於檢視和儲存過程的許可權問題探究儲存過程
- 儲存過程中使用Dbms_Scheduler包的許可權問題儲存過程
- 儲存過程,角色相關的呼叫者許可權和定義者許可權問題儲存過程
- EXECUTE IMMEDIATE 儲存過程中 許可權不足及EXECUTE IMMEDIATE的除錯避坑儲存過程除錯
- oracle儲存過程許可權繼承小結Oracle儲存過程繼承
- 儲存過程許可權__Authid Current_User儲存過程
- win10 儲存excel報錯 許可權問題怎麼解決Win10Excel
- ORA-01031: 許可權不足 ORACLE 817Oracle
- 檢視、儲存過程以及許可權控制練習儲存過程
- oracle儲存過程!解決網友問題Oracle儲存過程
- sqlplus / as sysdba 提示許可權不足(ORA-01031)問題處理SQL
- vue許可權問題解決方案Vue
- 如何在儲存過程中擁有role的許可權儲存過程
- 解決 PBootCMS 網站出現的“會話目錄寫入許可權不足”的問題boot網站會話
- 應用儲存過程執行報錯解決方案儲存過程
- ubuntu下解決wireshark許可權問題Ubuntu
- 儲存過程問題。。儲存過程
- oracle 通過trigger解決drop許可權問題Oracle
- 解決gitee中已經新增ssh公鑰後依然出現VisualStudio克隆git儲存庫許可權出錯問題Gitee
- 解決儲存過程擷取錯誤的問題儲存過程
- job中呼叫儲存過程,儲存過程使用AUTHID CURRENT_USER,還出現ORA-01031儲存過程
- java儲存過程呼叫servlet的授權問題Java儲存過程Servlet
- 讓使用者擁有儲存過程的除錯許可權儲存過程除錯
- Enterprise Library- Data Block使用oracle儲存過程出現問題的解決BloCOracle儲存過程
- Sqlserver 2014 用指令碼批次賦予使用者可以執行儲存過程的許可權SQLServer指令碼儲存過程
- 定義者許可權儲存過程role無效,必須要有顯式授權儲存過程