如何解決關于Oracle存儲過程執行權限問題?
在數據庫系統中存儲過程是必不可少的利器,存儲過程是預先編譯好的為實現一個復雜功能的一段Sql語句集合。它的優點我就不多說了,說一下我碰到的問題吧。我在項目開發的過程中需要用存儲過程來實現一個功能,其中涉及到判斷一張表是否已經建立,沒有建立就由存儲過程來建立這張表。
CREATE OR REPLACE PROCEDURE TestProc
IS
flag number;
BEGIN
select count(*) into flag from all_tables where table_name='TEMP3';
if (flag=0) then
execute immediate 'create global temporary table TEMP3 on commit preserve rows as select * from BUSI_ECONTRACT';
else
execute immediate 'insert into TEMP3 select * from BUSI_ECONTRACT';
end if;
END ;
寫這段存儲過程比較簡單,在測試執行的過程中,系統出現如下提示:
ora -01031 :權限不足
從錯誤提示我們定位到錯誤,發現存儲過程在執行 Create table語句時,權限不足。我嘗試著把存儲過程改成匿名存儲過程在PL/SQL中執行,語句既然通過了。這說明這段語句沒有問題,問題出現在執行存儲過程中。我使用的是DBA帳號登錄系統,按理應該不存在權限不足的問題呀。問題出現再哪里呢?通過上網查閱資料,發現Oracle對于執行存儲過程有和Sql-Server不一樣的規定,這個規定造成了執行建表語句權限不足。
Oracle規定,在默認的情況下,在調用存儲過程用戶的角色不起作用,即在執行存儲過程時只有Public權限。所以在調用Create table時,會有權限不足的提示。
存儲過程分為兩種,即DR(Definer's Rights ) Procedure和IR(Invoker's Rights ) Procedure。為什么會有兩種存儲過程呢?其實考慮完下面的問題就清楚了。比如說用戶hrch創建了刪除表tar_table的存儲過程drop_table(),當用戶hrch調用時,即刪除用戶hrch下