解決執行儲存過程出現許可權不足問題(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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL儲存過程的許可權問題MySql儲存過程
- sqlplus / as sysdba 提示許可權不足(ORA-01031)問題處理SQL
- all許可權使用者無法執行儲存過程儲存過程
- Vim儲存時許可權不足
- EXECUTE IMMEDIATE 儲存過程中 許可權不足及EXECUTE IMMEDIATE的除錯避坑儲存過程除錯
- oracle儲存過程許可權繼承小結Oracle儲存過程繼承
- win10 儲存excel報錯 許可權問題怎麼解決Win10Excel
- 檢視、儲存過程以及許可權控制練習儲存過程
- 解決gitee中已經新增ssh公鑰後依然出現VisualStudio克隆git儲存庫許可權出錯問題Gitee
- vue許可權問題解決方案Vue
- 如何在儲存過程中擁有role的許可權儲存過程
- 解決 PBootCMS 網站出現的“會話目錄寫入許可權不足”的問題boot網站會話
- 應用儲存過程執行報錯解決方案儲存過程
- Android SELinux avc dennied許可權問題解決方法AndroidLinux
- 多執行緒中自定義執行緒池與shiro導致的許可權錯亂問題解決執行緒
- 用無程式碼解決CRM角色許可權問題
- Docker容器掛載資料卷出現Permission denied許可權問題的解決辦法Docker
- MySQL許可權問題MySql
- Jenkins執行遠端Windows批處理的許可權問題JenkinsWindows
- Windows 直接訪問 WSL2 路徑並直接進行讀寫操作,許可權不足解決方法Windows
- win10管理員許可權不足怎麼設定_win10管理員許可權不足如何解決Win10
- 記一個 Android 14 適配引發的Android 儲存許可權問題Android
- 達夢儲存過程效能問題定位儲存過程
- mysql多次呼叫儲存過程的問題MySql儲存過程
- Centos sudo 許可權問題CentOS
- 更新完 zsh 說我目錄許可權問題的解決
- 深入解讀MySQL InnoDB儲存引擎Update語句執行過程MySql儲存引擎
- 解決Java執行過程中拋簽名異常的問題Java
- Oracle 編譯儲存過程卡死解決方法Oracle編譯儲存過程
- PbootCMS提示:“會話目錄寫入許可權不足”的解決辦法boot會話
- 許可權的級聯問題
- Ubuntu 下 Composer 許可權問題Ubuntu
- 通過IPFS技術解決NFT的永久儲存問題
- autohotkey透過com物件控制excel的許可權問題物件Excel
- mongo 儲存過程詳解Go儲存過程
- vscode在Linux環境下執行“許可權不夠”的解決方法VSCodeLinux
- 無程式碼實現CRM角色許可權問題
- 如何查詢一個儲存過程是否在執行儲存過程
- 儲存過程效能低的解決方法之一儲存過程