預設情況下,在呼叫儲存過程使用者的角色是不起作用的,即在執行儲存過程時只有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屬性值。
以下是官方說明:
Oracle儲存過程許可權問題
儲存過程分成兩種許可權 1.定義者許可權 authid definer 2.呼叫者許可權 authid current user 預設的情況下使用的是定義者許可權。1。定義者許可權使用遇到的問題 當使用定義者許可權時候,不管是你自己去call,還是其他使用者去call,效果是一樣的,都是用你的許可權...
Oracle 儲存過程許可權問題
今天在寫儲存過程時遇到乙個不大不小的問題,pl sql報 表或者試圖不存在,但是問題關鍵是單獨執行sql 四沒有問題的,人也很無奈,經查閱資料得知,是dba許可權問題。因為角色在函式 儲存過程 觸發器中都是失效的,也就是說,使用者從角色繼承過來的許可權,不能在函式 儲存過程 觸發器中使用。在函式 儲...
賦予oracle執行儲存過程許可權和建立表許可權
grant create any table to username grant create any procedure to username grant execute any procedure to username 建立執行job許可權 grant create job to 使用者 g...